目錄:
XML簽名概覽... 1
簡介... 1
為什麼需要XML簽名... 1
數字簽名... 2
XML簽名語法... 2
應用... 4
實現... 4
參考... 4
簡介
XML簽名是一種基於XML格式的簽名規范。它是W3C最早的XML安全方面的推薦標准規范。設計的XML簽名帶有多個目標,可提供“對任何數據類型的完整性、消息認證、和/或簽名者認證服務, 無論是在包括該簽名的 XML 內部還是在別處(這對因特網的發展意義重大)。”
XML實質上是定義了一些XML標簽,通過這些標簽來達到對XML文檔或其他數據進行簽名的目的。
本文首先說明XML簽名解決的問題,然後再從數字簽名原理、XML簽名語法、應用等各方面講述XML簽名。
為什麼需要XML簽名
互聯網在快速發展的同時,帶來了許多安全方面的挑戰。數據傳輸的機密性、完整性,消息認證,數據不可抵賴性等,都是在應用時需要高度重視的。正如簡介中所說,XML簽名能夠解決完整性、消息認證和不可抵賴性(即簽名者認證服務)。
完整性:即保證數據在傳輸過程中不被篡改。
消息認證:使數據接收者能夠確定消息來源的一項服務。
不可抵賴性:使數據發送者不能對自己已經發送數據的行為進行否認的一項服務。
同時,XML簽名是完全基於XML的,這使得它的應用將十分方便。還有一點很重要,它是W3C的推薦標准(要知道因特網上的應用,標准是十分重要的)。
數字簽名
數字簽名是密碼學中非常重要的一個領域,應用十分廣泛。
密碼學主要分為對稱和非對稱兩大類,其區別在於加解密密鑰是否相同。非對稱密碼學又稱公私鑰密碼學,是近代密碼學一個非常重大的突破。非對稱加密的加解密密鑰不同,一般稱其中一個為私鑰,另一個為公鑰。私鑰為用戶私有,公鑰通過某種機制公布,並且兩者無關聯(並非完全沒有聯系,是指從一個無法推的得另一個)。由於它使用兩種不同的密鑰,因而稱為非對稱,並且因此可以用於消息認證和防抵賴。
在應用數字簽名時,一般都會配合使用消息摘要算法(因為如果直接對原數據進行加密簽名的話,會使簽名十分冗長。所以先計算其摘要,再對摘要進行簽名)。消息摘要算法也是密碼學中很重要的一個方面。它是一種單向函數,對原數據進行變換並獲得摘要值(一般512位)。它的特點是攻擊者無法針對一個摘要逆向生成產生此摘要的原數據,由此可知它是提供完整性服務的關鍵。
下面是一個簡單的應用模式:
注:XML簽名規范是包括摘要部分的XML簽名語法,首先看個例子:
[來源於“XML-Signature Syntax and Processing”]
[s01] <Signature Id="MyFirstSignature" xmlns="http://www.w3.org/2000/09/XMLdsig#">
[s02] <SignedInfo>
[s03] <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-XML-c14n-20010315"/>
[s04] <SignatureMethod
Algorithm="http://www.w3.org/2000/09/XMLdsig#dsa-sha1"/>
[s05] <Reference
URI="http://www.w3.org/TR/2000/REC-xHtml1-20000126/">
[s06] <Transforms>
[s07] <Transform Algorithm="http://www.w3.org/TR/2001/REC-XML-c14n-20010315"/>
[s08] </Transforms>
[s09] <DigestMethod Algorithm="http://www.w3.org/2000/09/XMLdsig#sha1"/>
[s10] <DigestValue>j6lwx3rvEPO0vKtMup4NbeVu8nk=</DigestValue>
[s11] </Reference>
[s12] </SignedInfo>
[s13] <SignatureValue>MC0CFFrVLtRlk=...</SignatureValue>
[s14] <KeyInfo>
[s15a] <KeyValue>
[s15b] <DSAKeyValue>
[s15c] <P>...</P><Q>...</Q><G>...</G><Y>...</Y>
[s15d] </DSAKeyValue>
[s15e] </KeyValue>
[s16] </KeyInfo>
[s17] </Signature>
開始為一個Signature標簽,表示這是一個XML簽名。
2-12行為SignedInfo,其中Reference中指明簽名的對象,以及原數據的摘要。
13行為簽名值。
14-16行為KeyInfo標簽,指明簽名使用的公鑰信息。
例子中出現的標簽,以及為出現的標簽,將在下面簡要介紹。
[更加具體的說明以及相關的XML Schema或DTD可以參考“XML-Signature Syntax and Processing”]
1、 名稱空間
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"為XML簽名使用的名稱空間。
2、 Signature標簽
標識了特定環境下的一個完整XML簽名。包括子元素<SignedInfo>、<SingatureValue>、<KeyInfo>和<Object>,其中後兩個可選。屬性有Id,作為簽名的標識。
3、 SignedInfo標簽
最復雜的一個標簽,指明了規范化方法、數據源、簽名算法、摘要算法、摘要值以及簽名變換等。包括<CanonicalizationMethod>、<SignatureMethod>、<Reference>三個標簽,其中Reference標簽可以有多個,即簽名可以指定多個數據源。屬性Id為標識。
3.1、<CanonicalizationMethod>標簽
空標簽。屬性Algorithm用URI方式指定規范化的算法。
3.2、< SignatureMethod >標簽
空標簽。屬性Algorithm用URI方式指定簽名的算法。
3.3、<Reference>標簽
< DigestMethod>和< DigestValue>標簽分別指定摘要的算法和值。屬性Id為標識,URI指定數據源。< Transforms>指定簽名變換,由零至多個<Transform>子標簽構成。每個<Transform>子標簽為一種簽名變換。這裡的變換指的是簽名之前對需要簽名的數據進行的一種變換。<Transform>標簽的Algorithm屬性指定簽名變換算法。
4、 <KeyInfo>標簽
(可選。因為在實際應用中,上下文可能已經隱含了這個信息,或者雙方通過其他約定來傳遞這個信息)
包含<KeyName>、<KeyValue>、<RetrIEvalMethod>、<X509Data>、<PGPData>、<SPKIData>、<MgmtData>子標簽。
4.1、<KeyName>標簽
密鑰名稱的簡單文本標識符。
4.2、<KeyValue>標簽
RSA或DSA公鑰。
4.3、<RetrIEvalMethod>標簽
允許遠程訪問密鑰信息。
4.4、<X509Data>標簽
X.509證書數據。
4.5、<PGPData>標簽
PGP相關數據。
4.6、<SPKIData>標簽
SPKI相關數據。
4.7、<MgmtData>標簽
密鑰共識參數(如DiffIE-Hellman參數等)
5、 <Object>標簽用於附加信息。
再次強調,這裡只是簡要介紹,更加詳細的說明參考“XML-Signature Syntax and Processing”。
應用
XML簽名可以作為其他標准框架的一部分使用,當然也可以獨立適用,自己定義一個框架,自己生成和解析XML簽名。XML簽名已經廣泛應用於WS-Security中,具體可參閱WS-S的內容。
實現
現在已經出現了很多XML簽名開發包。主要有IBM的XML Security Suite和apache的XML Security。其中實現了XML簽名生成和校驗的API(Java)。
IBM的XML Security Suite:http://www.alphaworks.ibm.com/tech/XMLsecuritysuite/download
apache的XML Security:http://XML.apache.org/security/index.Html