XML數字簽名-Signature語法和簽名算法[轉]

XML數字簽名-Signature語法和簽名算法

 

一段Demo:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
        <!-- 規範化的算法 -->
        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
        <!-- 簽名算法:rsa-sha1 -->
        <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
        <!-- 確定待簽名的引用資源 -->
        <ds:Reference URI="">
            <!-- 轉換算法 -->
            <ds:Transforms>
                <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
            </ds:Transforms>
            <!-- 消息摘要的算法,比如:SHA1 -->
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <!-- 消息摘要 -->
            <ds:DigestValue>{{DigestValue}}</ds:DigestValue>
        </ds:Reference>
    </ds:SignedInfo>
    <!--  簽名內容 -->
    <ds:SignatureValue>{{SignatureValue}}</ds:SignatureValue>
    <!-- KeyInfo 元素可選,表明簽名的公鑰信息 -->
    <ds:KeyInfo>
        <ds:KeyName>{{KeyName}}</ds:KeyName>
        <ds:X509Data>
            <ds:X509Certificate>{{X509Certificate}}</ds:X509Certificate>
        </ds:X509Data>
    </ds:KeyInfo>
</ds:Signature>
 
XML
 

簽名算法

XML-signature 中的簽名算法就是對XML文檔樹進行簽名,說明如下:
1、確認簽名內容,通過 URL 將這些內容表示爲引用資源,用 Reference 標識。對於斷言信息來說,其 URI 是saml:Assertion的 ID
2、對待簽名的數據進行轉化處理,包括執行編碼規則、規範化算法等, Transform 指定了轉化的算法
3、對整個斷言進行消息摘要,DigestMethod 指定了消息摘要算法,消息摘要的結果保存在 DigestValue 元素中
4、構造包含 Reference 的 SignedInfo 元素
5、CanonicalizationMethod 元素指定了規範化的算法,如果不對其進行規範化處理,驗證 xml 簽名時可能因爲xml 結構表示不同而失敗
6、計算 SignedInfo 的摘要,使用 SignatureMethod 聲明的簽名算法,並對其進行簽名,結果保存到 SignatureValue 元素中
7、KeyInfo 元素可選,表明簽名的公鑰信息

 

舉例封內簽名(包封式簽名)

使用簽名被封裝在被簽名XML中的方式

 

需要被簽名的XML文檔如下:

<license>
  <test>hello world</test>
</license>
 
XML
 

簽名後的XML:

<license>
    <test>hello world</test>
    [s01]<ds:Signature
        xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        [s02]<ds:SignedInfo>
            [s03]<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
            [s04]<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
            [s05]<ds:Reference URI="">
                [s06]<ds:Transforms>
                    [s07]<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                [s08]</ds:Transforms>
                [s09]<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                [s10]<ds:DigestValue>d+F/TTTxoF2Fk/knoTwHLqC7gqa+ETnTn84sNwx4c0Y=</ds:DigestValue>
            [s11]</ds:Reference>
        [s12]</ds:SignedInfo>
        [s13]<ds:SignatureValue>KdSti.....6OA==</ds:SignatureValue>
        [s14]<ds:KeyInfo>
            [s15a]<ds:KeyValue>
                [a15b]<ds:RSAKeyValue>
                    [a15c]<ds:Modulus>nM95A0J.....+GQ==</ds:Modulus>
                    [a15d]<ds:Exponent>AQAB</ds:Exponent>
                [a15e]</ds:RSAKeyValue>
            [a15f]</ds:KeyValue>
        [a16]</ds:KeyInfo>
    [a17]</ds:Signature>
</license>
 
XML
 

元素說明

 

SignedInfo

[s02-12]該元素的子元素包含有關所簽名的內容以及簽名方式的所有信息。簽名算法實際上應用於該元素及其所有子元素以生成簽名。

 

CanonicalizationMethod

[s03]該元素指定了用於SignedInfo元素以便將XML規範化的規範化(C14N)算法。

 

SignatureMethod

[s04]該元素指定了該簽名的簽名算法。這裏的簽名算法是帶有RSA的SHA-256。

 

Reference

[s05-11]這些元素指定了將要簽名的數據以及在哈希運算之前應當如何對該數據進行處理。URI屬性(它表示統一資源標識符)標識要簽名的數據,而Transforms元素(稍後描述)指定在進行哈希運算之前如何處理數據。在該示例中,我們將使用特殊的URI——空字符串,它指定包含簽名的文檔是要包含在簽名中的數據。XML簽名標準對Reference數據使用間接簽名機制。該標準不是對Reference中的所有數據進行哈希運算然後加密哈希值,而是使用由Reference的DigestMethod元素所指定的算法對每個Reference的數據進行哈希運算,然後將哈希值存儲到Reference的DigestValue元素中。接下來,對SignedInfo元素和它的所有子元素(包括Reference元素)進行哈希運算;哈希值被加密以生成簽名。因此,您實際上是對Reference元素中所引用數據的哈希的哈希進行簽名,但是該方案仍然可以保護數據的完整性。
[s05]Reference的這個可選 URI 屬性標識要簽名的數據對象。 在一個 Signature 中,至多可以對一個Reference省略該屬性。(爲了確保明確地匹配引用和對象, 要強加這個限制。)
[s06-08]該標識與transforms一起是簽名者提供的描述, 其內容有關它們如何獲得已編摘形式的已簽名數據對象(即,已編摘的內容)。驗證者還可能以另一種方法獲得已編摘的內容,只要摘要驗證這種方法。

 

Transforms

[s06-08]每個Reference元素都可以具有零個或更多個爲它指定的轉換。這些轉換按照它們在XML中列出的順序應用於該Reference的數據。轉換使您可以在對Reference的數據進行哈希運算之前對該數據進行篩選或修改。在該示例中,我們將使用包封式簽名轉換,該轉換選擇了包含文檔中除Signature元素以外的所有XML。我們必須從將被簽名的數據中移除Signature元素,否則,當我們存儲簽名值時,可能會修改我們嘗試簽名的數據。

 

DigestMethod

[s09-10]DigestMethod 是在應用 Transforms(如果已經指定它)之後對數據應用以產生 DigestValue 的算法。DigestValue 的簽名是將資源內容與簽名者密鑰綁定的機制。

 

SignatureValue

[s13]該元素包含通過簽名SignedInfo元素及其所有子元素而計算得到的簽名值。

 

KeyInfo

[s14-16]KeyInfo表示用於驗證簽名的密鑰。標識機制可以包括證書、密鑰名稱和密鑰協議算法。KeyInfo是可選的有兩個原因。首先,簽名者可能不希望向所有文檔處理方披露任何密鑰信息。爲什麼總要告訴人家?其次,該信息在應用程序上下文中可能是已知的,並且不需要明確表示。 由於KeyInfo在SignedInfo之外,所以如果簽名者希望將密鑰信息與簽名綁定,那麼Reference可以容易地將KeyInfo作爲簽名的一部分標識並將其包括在內。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章