3 回答
TA贡献1872条经验 获得超3个赞
最后,我找到了如何获取所有值。
规范化 <SignedInfo><Reference> 中定义的 XML 元素。在这种情况下,它是 <soap:Body> 元素。规范化只添加了肥皂命名空间并添加了结束标签。我在 Go 中生成这些,而 Go 从不生成自闭合标签。
从规范化 <soap:Body> 的字符串表示中计算哈希,因为它将在请求中发送。
将计算的摘要添加到相应 <Reference> 的 <DigestValue> 中。
规范化 <SignedInfo> 并计算它的哈希值。
签署此哈希并将值添加到 <SignedValue>。
我知道这不是通用方法,但它应该对我有用。C14N 不是必需的,因为如果您注意属性顺序并手动添加命名空间,Go 可以产生相同的结果。
TA贡献1846条经验 获得超7个赞
参考 XML 示例 CZ00000019.valid.v3.xml(捷克财政当局 EET 的),规范化的 SignedInfo 是:
var signedinfoCanon
= '<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'
+ '<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">'
+ '<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soap"></ec:InclusiveNamespaces>'
+ '</ds:CanonicalizationMethod>'
+ '<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"></ds:SignatureMethod>'
+ '<ds:Reference URI="#id-A72D6FD4C41B1F545F14700558808234">'
+ '<ds:Transforms>'
+ '<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">'
+ '<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList=""></ec:InclusiveNamespaces>'
+ '</ds:Transform>'
+ '</ds:Transforms>'
+ '<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></ds:DigestMethod>'
+ '<ds:DigestValue>4hn06sSS2yurIiUmWaV36JQJZrwbWf36sG9bOHH/ycM=</ds:DigestValue>'
+ '</ds:Reference>'
+ '</ds:SignedInfo>'
TA贡献1824条经验 获得超5个赞
像这样计算sha256
import (
"crypto/sha256"
)
var slice = []byte("test")
return sha256.Sum256(slice)
- 3 回答
- 0 关注
- 204 浏览
添加回答
举报