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

相關文章
相關標籤/搜索