關(guān)于XML簽名的介紹
本文比較全面地介紹了XML簽名,但并未深入探究。本人水平有限,錯(cuò)誤難免,歡迎指正,共同探討。
簡介
XML簽名是一種基于XML格式的簽名規(guī)范。它是W3C最早的XML安全方面的推薦標(biāo)準(zhǔn)規(guī)范。設(shè)計(jì)的XML簽名帶有多個(gè)目標(biāo),可提供“對(duì)任何數(shù)據(jù)類型的完整性、消息認(rèn)證、和/或簽名者認(rèn)證服務(wù), 無論是在包括該簽名的 XML 內(nèi)部還是在別處(這對(duì)因特網(wǎng)的發(fā)展意義重大)。”
XML實(shí)質(zhì)上是定義了一些XML標(biāo)簽,通過這些標(biāo)簽來達(dá)到對(duì)XML文檔或其他數(shù)據(jù)進(jìn)行簽名的目的。
本文首先說明XML簽名解決的問題,然后再從數(shù)字簽名原理、XML簽名語法、應(yīng)用等各方面講述XML簽名。
為什么需要XML簽名
互聯(lián)網(wǎng)在快速發(fā)展的同時(shí),帶來了許多安全方面的挑戰(zhàn)。數(shù)據(jù)傳輸?shù)臋C(jī)密性、完整性,消息認(rèn)證,數(shù)據(jù)不可抵賴性等,都是在應(yīng)用時(shí)需要高度重視的。正如簡介中所說,XML簽名能夠解決完整性、消息認(rèn)證和不可抵賴性(即簽名者認(rèn)證服務(wù))。
完整性:即保證數(shù)據(jù)在傳輸過程中不被篡改。
消息認(rèn)證:使數(shù)據(jù)接收者能夠確定消息來源的一項(xiàng)服務(wù)。
不可抵賴性:使數(shù)據(jù)發(fā)送者不能對(duì)自己已經(jīng)發(fā)送數(shù)據(jù)的行為進(jìn)行否認(rèn)的一項(xiàng)服務(wù)。
同時(shí),XML簽名是完全基于XML的,這使得它的應(yīng)用將十分方便。還有一點(diǎn)很重要,它是W3C的推薦標(biāo)準(zhǔn)(要知道因特網(wǎng)上的應(yīng)用,標(biāo)準(zhǔn)是十分重要的)。
數(shù)字簽名
數(shù)字簽名是密碼學(xué)中非常重要的一個(gè)領(lǐng)域,應(yīng)用十分廣泛。
密碼學(xué)主要分為對(duì)稱和非對(duì)稱兩大類,其區(qū)別在于加解密密鑰是否相同。非對(duì)稱密碼學(xué)又稱公私鑰密碼學(xué),是近代密碼學(xué)一個(gè)非常重大的突破。非對(duì)稱加密的加解密密鑰不同,一般稱其中一個(gè)為私鑰,另一個(gè)為公鑰。私鑰為用戶私有,公鑰通過某種機(jī)制公布,并且兩者無關(guān)聯(lián)(并非完全沒有聯(lián)系,是指從一個(gè)無法推的得另一個(gè))。由于它使用兩種不同的密鑰,因而稱為非對(duì)稱,并且因此可以用于消息認(rèn)證和防抵賴。
在應(yīng)用數(shù)字簽名時(shí),一般都會(huì)配合使用消息摘要算法(因?yàn)槿绻苯訉?duì)原數(shù)據(jù)進(jìn)行加密簽名的話,會(huì)使簽名十分冗長。所以先計(jì)算其摘要,再對(duì)摘要進(jìn)行簽名)。消息摘要算法也是密碼學(xué)中很重要的一個(gè)方面。它是一種單向函數(shù),對(duì)原數(shù)據(jù)進(jìn)行變換并獲得摘要值(一般512位)。它的特點(diǎn)是攻擊者無法針對(duì)一個(gè)摘要逆向生成產(chǎn)生此摘要的原數(shù)據(jù),由此可知它是提供完整性服務(wù)的關(guān)鍵。
下面是一個(gè)簡單的應(yīng)用模式:
注:XML簽名規(guī)范是包括摘要部分的XML簽名語法,首先看個(gè)例子:
[來源于“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]
開始為一個(gè)Signature標(biāo)簽,表示這是一個(gè)XML簽名。
2-12行為SignedInfo,其中Reference中指明簽名的對(duì)象,以及原數(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)識(shí)了特定環(huán)境下的一個(gè)完整XML簽名。包括子元素
3、? SignedInfo標(biāo)簽
最復(fù)雜的一個(gè)標(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)識(shí),URI指定數(shù)據(jù)源。< Transforms>指定簽名變換,由零至多個(gè)
4、?
?。蛇x。因?yàn)樵趯?shí)際應(yīng)用中,上下文可能已經(jīng)隱含了這個(gè)信息,或者雙方通過其他約定來傳遞這個(gè)信息)
包含
4.1、
密鑰名稱的簡單文本標(biāo)識(shí)符。
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í)參數(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ú)立適用,自己定義一個(gè)框架,自己生成和解析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)。





