我想解析 XML-DSIG 文件及其内容。我在 Wikipedia 上阅读了有关它的结构和一些
xmldsig-core
规范 的内容。但我无法弄清楚一些事情,假设这是我得到的 XML-DSIG 示例:
<?xml version="1.0"?>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="urn:xml-dsig:transformation:v1.1"/>
<SignatureMethod Algorithm="some-algo"/>
<Reference URI="#KeyInfo">
<Transforms>
<Transform Algorithm="urn:xml-dsig:transformation:v1.1"/>
</Transforms>
<DigestMethod Algorithm="some-algo-256"/>
<DigestValue>some-hash-256</DigestValue>
</Reference>
<Reference URI="#Object">
<Transforms>
<Transform Algorithm="urn:xml-dsig:transformation:v1.1"/>
</Transforms>
<DigestMethod Algorithm="some-algo-256"/>
<DigestValue>some-hash-256</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>signature-value-in-base-64</SignatureValue>
<KeyInfo Id="KeyInfo">
<X509Data>
<X509Certificate>x509-cert-in-base-64</X509Certificate>
</X509Data>
</KeyInfo>
<Object Id="Object">
<Result>
...Initial XML I was signing...
</Result>
</Object>
</Signature>
我的问题是:
#KeyInfo
位于 <Reference>
标签中,则意味着 <KeyInfo>
部分也已被签名? (因为 wiki 说“一个或多个 Reference 元素指定由 URI 引用签名的资源”)。这就引出了第二个问题<KeyInfo>
和<Object>
中的数据进行签名,那么实际上签名的是什么?它只是计算出的 xml 的这两部分的哈希值并且位于 <DigestValue>
标签中,还是从 <KeyInfo
开始到 </KeyInfo>
结束标签及其之间的数据的整个标签? (与<Object>
同样的问题)。Wiki 没有指定此类内容,我迷失在 RFC 中并且找不到这些问题的答案。
KeyInfo
将包含在签名中。SignedInfo
元素的内容是实际被签名的内容。首先使用指定的转换对其进行规范化,然后将该序列化元素的字节输入到您选择的签名算法中。实际内容(KeyInfo
和 Object
)通过 DigestValue
中存在 SignedInfo
元素包含在签名中,而不是直接签名。因此,在签名验证过程中验证这些哈希值是否正确至关重要。