XML 签名--数字签名

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

转载于:https://my.oschina.net/u/943316/blog/1504112

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值