XML 签名--数字签名

XML 数字签名

1.类型

封内签名

这种签名是将签名做为XML对象的子信息,也就是说 <Signature>是邮件中XML文件的子标签。封内数字签名的结构以下:html

<RootElement>
    <!--主要内容-->
    ......
    <!--签名-->
    <Signature>
    ……
    </Signature>
</ RootElement>

本文会介绍如何建立XML封内数字签名。算法

封外签名

这种签名将XML文档包含到Signature对象,也就是说<Signature>标签是签名XML文件的根元素。封外签名结构以下:加密

<Signature >
    < MyXMLDocument >
    ....
    </ MyXMLDocument >
</Signature>

分离签名

这种状况下,签名是独立生成的不做为XML的一部分。也就是说你会拥有两个XML文件:一个待签名的XML文件,另外一个是XML签名。spa

<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.实际例子

 http://www.javashuo.com/article/p-ukeiejfg-ep.html.net

参考

https://www.ibm.com/developerworks/cn/xml/x-digsig/code

http://blog.sina.com.cn/s/blog_1365a599b0102vjej.htmlorm

相关文章
相关标签/搜索