XML数字签名方式和示例
XML签名可以用来确保XML文档内的内容没有发生改变,如果和XML加密联合使用,即可保证所接收的数据就是所发送的数据,外人无法阅读加密内容。XML数字签名有两种方式,即封装签名和分离签名,可以应用到任意数据内容。所谓封装(或被封装)签名,是指数据和签名在同一个XML文档中,而那些数据在签名元素外部的签名称为分离签名。下面是一个分离签名示例,XML文件经过数字签名之后,其内容如下所示:
[s01]<Signature Id="MyFirstSignature"
xmlns="http://www.w3.org/2000/09/xmldsig#">
[s02]<SignedInfo>
[s03]<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/
REC-XML-c14n-20010315"/>
[s04]<SignatureMethod Algorithm="http://www.w3.org/2000/09/
xmldsig#dsa-sha1"/>
[s05] <Reference URI="http://www.w3.org/TR/2000/REC-xhtml1-20000126/">
[s06] <Transforms>
[s07] <Transform Algorithm="http://www.w3.org/TR/2001/REC-XML-c14n-
20010315"/>
[s08] </Transforms>
[s09] <DigestMethod?Algorithm="http://www.w3.org/2000/09/
xmldsig#sha1"/>
[s10] <Digestvalue>j6lwx3rvEPO0vKtMup4NbeVu8nk=</Digestvalue>
[s11] </Reference>
[s12]</SignedInfo>
[s13]<Signaturevalue>MC0CFFrVLtRlk=...</Signaturevalue>
[s14] <KeyInfo>
[s15a] <Keyvalue>
[s15b] <DSAKeyvalue>
[s15c] <p>...</p><Q>...</Q><G>...</G><Y>...</Y>
[s15d] </DSAKeyvalue>
[s15e] </Keyvalue>
[s16] </KeyInfo>
[s17]</Signature>
以上清单中 s02行和s12行之间是SignedInfo元素,即实际签名的信息。SignedInfo 的核心验证由两个必要过程组成:对 SignedInfo 的签名验证和 SignedInfo 内部每个 Reference 摘要的验证。
s03行上, CanonicalizationMethod 标识了一种算法,这种算法被用来规范化 SignedInfo 元素,然后该元素作为签名操作的一部分被编摘。规范化(Canonicalization)是一种方法,过程使用该方法处理可包含在同一数据元素内部的不同数据流,例如,可以包含两种不同方法来表示文本。规范化是解释原始数据以使空格显示为空格而不显示为 ASCII 码的方法。
s04行上,SignatureMethod引用的是将规范化的SignedInfo转换成Signaturevalue所用的算法。它是密钥相关的算法和摘要算法(在这里是DSA和SHA-1)的组合,为算法名签名以抵抗攻击,该攻击是基于替换成效率更低的算法。要提高应用程序的互操作性,候选方案指定一组需要实现的签名算法,虽然它们的使用任凭签名创建者处理。
[s05-11] 每个 Reference 元素都包括摘要方法和对已标识数据对象计算得出的摘要值。它还可能包括产生对摘要操作的输入的转换。数据对象的签名是通过计算其摘要值并对该值的签名进行的。稍后通过引用和签名验证来检查该签名,这些验证将重新创建摘要值并确保它与该数据对象中的内容匹配。
s05行上,Reference 的这个可选 URI 属性标识要签名的数据对象。在一个 Signature 中,至多可以对一个 Reference 省略该属性。(为了确保明确地匹配引用和对象,要强加这个限制。)
[s05-08] 该标识与 transforms 一起是签名者提供的描述,其内容有关它们如何获得已编摘形式的已签名数据对象(即,已编摘的内容)。验证者还可能以另一种方法获得已编摘的内容,只要摘要验证这种方法。
Transforms 是一种可选的处理步骤排序列表,在编摘资源内容之前,对它应用这些步骤。这是解密所需遵循的轨迹。Transforms 可以包括如规范化、编码/解码(包括压缩/扩张)、XSLT 和 XPath 等操作。XPath 转换有些复杂,因为它们允许签名者派生出省略一部分源文档的XML文档,并将XML树限制为它原来的那样。因此,未包含部分可以更改,而不影响签名有效性。 如果不存在 Transforms 元素,则直接编摘资源内容。应该记住,即使在候选方案中指定了基本缺省设置,还是允许用户指定的转换。
[s09-10] DigestMethod 是在应用 Transforms(如果已经指定它)之后对数据应用以产生 DigestValue 的算法。DigestValue 的签名是将资源内容与签名者密钥绑定的机制。
s13行上是SignatureValue 元素本身,它在 SignedInfo 之外,即位于签名部分之外,不过计算 SignatureValue 所使用的算法则包括在已签名的信息中。
s14行和s16行之间是KeyInfo元素(该元素是可选的),它指出了用于验证签名的密钥。标识机制可以包括证书、密钥名称和密钥协议算法。KeyInfo 是可选的有两个原因。首先,签名者可能不希望向所有文档处理方披露任何密钥信息。为什么总要告诉人家?其次,该信息在应用程序上下文中可能是已知的,并且不需要明确表示。由于 KeyInfo 在 SignedInfo 之外,所以如果签名者希望将密钥信息与签名绑定,那么 Reference 可以容易地将 KeyInfo 作为签名的一部分标识并将其包括在内。
点这里回到文章导读>>>