XML 数字签名
1.类型
封内签名
这种签名是将签名作为XML对象的子信息,也就是说 <Signature>是邮件中XML文件的子标签。封内数字签名的结构如下:
<RootElement>
<!--主要内容-->
......
<!--签名-->
<Signature>
……
</Signature>
</ RootElement>
本文会介绍如何创建XML封内数字签名。
封外签名
这种签名将XML文档包含到Signature对象,也就是说<Signature>标签是签名XML文件的根元素。封外签名结构如下:
<Signature >
< MyXMLDocument >
....
</ MyXMLDocument >
</Signature>
分离签名
这种情况下,签名是独立生成的不作为XML的一部分。也就是说你会拥有两个XML文件:一个待签名的XML文件,另一个是XML签名。
<Signature >
.....
</Signature>
2.内容
<!--Signature 是XML数字签名的根元素,这一点由W3C建议并且必须遵守-->
<Signature>
<!--SignedInfo 元素是你的签名信息
SignedInfo 的核心验证由两个必要过程组成:对 SignedInfo 的签名验证
和 SignedInfo 内部每个 Reference 摘要的验证-->
<SignedInfo>
<!--CanonicalizationMethod 标识了一种算法,
这种算法被用来规范化 SignedInfo 元素, 然后该元素作为签名操作的一部分被编摘-->
<CanonicalizationMethod Algorithm="" />
<!--SignatureMethod 是用于将已规范化的 SignedInfo 转换成 SignatureValue 的算法。
这是编摘算法、密钥从属算法和可能的其它算法的组合。-->
<SignatureMethod Algorithm="" />
<!--至少包含一个 Reference 元素,每个 Reference 元素用于对待签名数据进行引用,
包含有引用方式、转换方法、DigestMethod 摘要算法和 DigestValue 摘要值等信息。
Reference 还包含有 XML 数据的规则化方法,并指定了数字签名所使用的算法。
-->
<!--每个 Reference 元素都包括摘要方法和 对已标识数据对象计算得出的摘要值。
它还可能包括产生对摘要操作的输入的转换。数据对象的签名是通过计算其 摘要值并对该值的签名进行的。
稍后通过引用和签名验证来检查该签名,这些验证将重新创建摘要值并确保它与该数据对象中的内容匹配
-->
<Reference URI=""> <!--URI 属性标识要签名的数据对象(一个xml元素或其他)-->
<!--Transforms 是一种可选的处理步骤排序列表, 在编摘资源内容之前,对它应用这些步骤。
这是解密所需遵循的轨迹,签名前可能对被签名对象所要做的转换。
比如当待签名的对象是一个二进制资源时,为了避免该对象中可能出现非法的XML格式,
就需要用Base-64将其转换一下。这里还可以使用一些其他的转化方法如XPATH和XSLT
-->
<Transforms>
<Transform Algorithm="" />
</Transforms>
<!-- DigestMethod 是在应用 Transforms(如果已经指定它)之后,
对数据应用以产生 DigestValue 的算法
对引用对象做摘要的方法,一般使用SHA1-->
<DigestMethod Algorithm="" />
<!--DigestValue 的签名是将资源内容与签名者密钥绑定的机制
存放做完摘要后的结果,这样当后面对做SignedInfo签名的时候就间接的对引用对象做了签名,
从而保证其完整-->
<DigestValue>...</DigestValue>
</Reference>
</SignedInfo>
<!--SignatureValue包含了实际的签名以及使用Base64加密的内容
包含对 Reference 元素规范化后的内容进行签名生成的数字签名的值-->
<SignatureValue>...</SignatureValue>
<!--KeyInfo 表示公钥,标识机制可以包括证书、密钥名称和密钥协议算法
keyInfo 是可选(不希望公开或者上下文已知)-->
<KeyInfo>
<KeyValue>
<RSAKeyValue>
<Modulus></Modulus>
<Exponent></Exponent>
</RSAKeyValue>
</KeyValue>
</KeyInfo>
</Signature>
3.实际例子
https://my.oschina.net/u/943316/blog/1504032
参考
https://www.ibm.com/developerworks/cn/xml/x-digsig/
http://blog.sina.com.cn/s/blog_1365a599b0102vjej.html