本文比較全面地介紹了XML簽名,但并未深入探究。本人水平有限,錯誤難免,歡迎指正,共同探討。
簡介
XML簽名是一種基于XML格式的簽名規(guī)范。它是W3C最早的XML安全方面的推薦標(biāo)準(zhǔn)規(guī)范。設(shè)計的XML簽名帶有多個目標(biāo),可提供“對任何數(shù)據(jù)類型的完整性、消息認(rèn)證、和/或簽名者認(rèn)證服務(wù), 無論是在包括該簽名的 XML 內(nèi)部還是在別處(這對因特網(wǎng)的發(fā)展意義重大)。”
XML實(shí)質(zhì)上是定義了一些XML標(biāo)簽,通過這些標(biāo)簽來達(dá)到對XML文檔或其他數(shù)據(jù)進(jìn)行簽名的目的。
本文首先說明XML簽名解決的問題,然后再從數(shù)字簽名原理、XML簽名語法、應(yīng)用等各方面講述XML簽名。
為什么需要XML簽名
互聯(lián)網(wǎng)在快速發(fā)展的同時,帶來了許多安全方面的挑戰(zhàn)。數(shù)據(jù)傳輸?shù)臋C(jī)密性、完整性,消息認(rèn)證,數(shù)據(jù)不可抵賴性等,都是在應(yīng)用時需要高度重視的。正如簡介中所說,XML簽名能夠解決完整性、消息認(rèn)證和不可抵賴性(即簽名者認(rèn)證服務(wù))。
完整性:即保證數(shù)據(jù)在傳輸過程中不被篡改。
消息認(rèn)證:使數(shù)據(jù)接收者能夠確定消息來源的一項(xiàng)服務(wù)。
不可抵賴性:使數(shù)據(jù)發(fā)送者不能對自己已經(jīng)發(fā)送數(shù)據(jù)的行為進(jìn)行否認(rèn)的一項(xiàng)服務(wù)。
同時,XML簽名是完全基于XML的,這使得它的應(yīng)用將十分方便。還有一點(diǎn)很重要,它是W3C的推薦標(biāo)準(zhǔn)(要知道因特網(wǎng)上的應(yīng)用,標(biāo)準(zhǔn)是十分重要的)。
數(shù)字簽名
數(shù)字簽名是密碼學(xué)中非常重要的一個領(lǐng)域,應(yīng)用十分廣泛。
密碼學(xué)主要分為對稱和非對稱兩大類,其區(qū)別在于加解密密鑰是否相同。非對稱密碼學(xué)又稱公私鑰密碼學(xué),是近代密碼學(xué)一個非常重大的突破。非對稱加密的加解密密鑰不同,一般稱其中一個為私鑰,另一個為公鑰。私鑰為用戶私有,公鑰通過某種機(jī)制公布,并且兩者無關(guān)聯(lián)(并非完全沒有聯(lián)系,是指從一個無法推的得另一個)。由于它使用兩種不同的密鑰,因而稱為非對稱,并且因此可以用于消息認(rèn)證和防抵賴。
在應(yīng)用數(shù)字簽名時,一般都會配合使用消息摘要算法(因?yàn)槿绻苯訉υ瓟?shù)據(jù)進(jìn)行加密簽名的話,會使簽名十分冗長。所以先計算其摘要,再對摘要進(jìn)行簽名)。消息摘要算法也是密碼學(xué)中很重要的一個方面。它是一種單向函數(shù),對原數(shù)據(jù)進(jìn)行變換并獲得摘要值(一般512位)。它的特點(diǎn)是攻擊者無法針對一個摘要逆向生成產(chǎn)生此摘要的原數(shù)據(jù),由此可知它是提供完整性服務(wù)的關(guān)鍵。
下面是一個簡單的應(yīng)用模式:
注:XML簽名規(guī)范是包括摘要部分的XML簽名語法,首先看個例子:
[來源于“XML-Signature Syntax and Processing”]
? [s01]
?? [s02]??
?? [s03]??
?? [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]????
?? [s07]??????
?? [s08]????
?? [s09]????
?? [s10]????
?? [s11]??
?? [s12]
?? [s13]??
?? [s14]??
?? [s15a]???
?? [s15b]?????
?? [s15c]???????
...
?? [s15d]?????
?? [s15e]???
?? [s16]??
?? [s17]
開始為一個Signature標(biāo)簽,表示這是一個XML簽名。
2-12行為SignedInfo,其中Reference中指明簽名的對象,以及原數(shù)據(jù)的摘要。
13行為簽名值。
14-16行為KeyInfo標(biāo)簽,指明簽名使用的公鑰信息。
例子中出現(xiàn)的標(biāo)簽,以及為出現(xiàn)的標(biāo)簽,將在下面簡要介紹。
[更加具體的說明以及相關(guān)的XML Schema或DTD可以參考“XML-Signature Syntax and Processing”]
1、? 名稱空間
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"為XML簽名使用的名稱空間。
2、? Signature標(biāo)簽
標(biāo)識了特定環(huán)境下的一個完整XML簽名。包括子元素
3、? SignedInfo標(biāo)簽
最復(fù)雜的一個標(biāo)簽,指明了規(guī)范化方法、數(shù)據(jù)源、簽名算法、摘要算法、摘要值以及簽名變換等。包括
3.1、
空標(biāo)簽。屬性Algorithm用URI方式指定規(guī)范化的算法。
3.2、< SignatureMethod >標(biāo)簽
?????? 空標(biāo)簽。屬性Algorithm用URI方式指定簽名的算法。
3.3、
< DigestMethod>和< DigestValue>標(biāo)簽分別指定摘要的算法和值。屬性Id為標(biāo)識,URI指定數(shù)據(jù)源。< Transforms>指定簽名變換,由零至多個
4、?
(可選。因?yàn)樵趯?shí)際應(yīng)用中,上下文可能已經(jīng)隱含了這個信息,或者雙方通過其他約定來傳遞這個信息)
包含
4.1、
密鑰名稱的簡單文本標(biāo)識符。
4.2、
?????? RSA或DSA公鑰。
4.3、
允許遠(yuǎn)程訪問密鑰信息。
4.4、
?????? X.509證書數(shù)據(jù)。
4.5、
?????? PGP相關(guān)數(shù)據(jù)。
4.6、
?????? SPKI相關(guān)數(shù)據(jù)。
4.7、
?????? 密鑰共識參數(shù)(如Diffie-Hellman參數(shù)等)
5、?
用于附加信息。
再次強(qiáng)調(diào),這里只是簡要介紹,更加詳細(xì)的說明參考“XML-Signature Syntax and Processing”。
應(yīng)用
XML簽名可以作為其他標(biāo)準(zhǔn)框架的一部分使用,當(dāng)然也可以獨(dú)立適用,自己定義一個框架,自己生成和解析XML簽名。XML簽名已經(jīng)廣泛應(yīng)用于WS-Security中,具體可參閱WS-S的內(nèi)容。
實(shí)現(xiàn)
現(xiàn)在已經(jīng)出現(xiàn)了很多XML簽名開發(fā)包。主要有IBM的XML Security Suite和apache的XML Security。其中實(shí)現(xiàn)了XML簽名生成和校驗(yàn)的API(Java)。