XML Signature

XML Signature(也稱作XMLDsigXML-DSigXML-Sig)是一個定義數碼簽章XML語法的W3C推薦標準。從功能上或,XML Signature與PKCS#7有很多共同點,但是XML簽章具有更好的可延伸性,並為簽章XML文件做了調整。XML Signature在許多Web技術,如SOAP, SAML等中使用。

XML signature可以用來簽章任何類型的數據(稱作資源),最常見的是XML文件,但是任何可以通過URL訪問的資源都可以被簽章。如果XML簽章用於對包含該簽章的XML文件之外的資源簽章,則稱為detached signature如果XML簽章用於對包含它的XML文件的某個部分進行簽章,則稱為enveloped signature;如果XML簽章包含被簽章的數據,則稱為enveloping signature。

結構

一個XML簽章包含一個Signature元素,其名字空間為http://www.w3.org/2000/09/xmldsig#。基本結構如下所示:

<Signature>
  <SignedInfo>
    <SignatureMethod />
    <CanonicalizationMethod />
    <Reference>
       <Transforms>
       <DigestMethod>
       <DigestValue>
    </Reference>
    <Reference />  </SignedInfo>
  <SignatureValue />
  <KeyInfo />
  <Object />
</Signature>
  • SignedInfo元素包含或參照簽章後的數據,並指出使用了那種演算法。
    • SignatureMethod和CanonicalizationMethod元素被SignatureValue元素所使用,並包含在SignedInfo元素中以防止篡改。
    • 一個或多個Reference元素通過URI參照的方式說明被簽章的資源;以及在簽章前對資源進行的任何轉換。轉換可以是一個XPath表達式,從文件樹中選擇一個子集[1]
      • DigestMethod元素指定雜湊演算法。
      • DigestValue元素包含轉換後資源經過雜湊演算法的結果。
  • SignatureValue元素包含一個經過Base64編碼的簽章結果 - 簽章是按照SignedInfo元素中的SignatureMethod元素中指明的參數進行的,簽章前要先根據CanonicalizationMethod元素中指定的演算法進行規範化。
  • KeyInfo元素(可選)允許簽章者為接收者提供驗簽該簽章的金鑰,通常是以一個或多個X.509數碼證書的形式。如果沒有出現KeyInfo元素,接收方必須從上下文中辨識出驗簽的金鑰。
  • Object元素(可選)包含被簽章的數據,如果是enveloping signature(簽章的數據在Signature元素內)的情況。

驗證及安全考慮

當驗證一個XML簽章時,需要遵守一個稱作核心驗證(Core Validation)的程式:

  1. 參照驗證:每一個參照的摘要都通過取得相應的資源,並且按照指定的轉換方法和摘要方法進行轉換和摘要,然後將結果與DigestValue元素中的內容進行比較,如果不匹配,驗證失敗。
  2. 簽章驗證:SignedInfo元素使用CanonicalizationMethod元素中指定的XML標準化方法進行處理,金鑰或取自KeyInfo元素或通過其他方法取得,然後通過SignatureMethod指定的簽章方法進行驗簽。

這一程式確定該資源是否是真的由宣稱的當事人簽章的。然而由於XML標準化和轉換方法的可延伸性,驗證方必須同時確認實際被簽章或摘要的正式在原始數據中出現的內容,換句話說,確信簽章或摘要所使用的演算法沒有改變被簽章的數據的意思。

XML規範化

XML簽章的產生要比通常的數碼簽章的產生複雜一點,這有由於一個給定的XML文件(在XML開發人員通用的說法是"XML資訊集")可能包含合法的序列化的表達方式以外的內容。例如,在XML元素中的白空格從句法上說是沒有意義的,因此<Elem >和<Elem>沒有區別。

由於數碼簽章是由非對稱金鑰加密演算法(通常是RSA加密演算法)對序列化的XML文件進行雜湊(通常是SHA1)的結果進行加密。一個位元組的差別會導致數碼簽章的不同。

此外,如果XML文件是在電腦間傳輸,不同作業系統的換行符可能不同,從CR到LF再到CR LF等。 對XML文件進行摘要和驗證的程式可能隨後以不同的方式呈現XML。例如,在元素定義的屬性定義間添加額外的空格,或是使用相對的(而不是絕對的)URL,或者改變XML命名空間定義的順序。標準化的XML對於參照遠端文件的XML數碼簽章尤其重要,遠端伺服器可能會隨時間改變XML呈現的方式。

為了避免這些問題,並保證邏輯上相同的XML文件會產生相同的數碼簽章,在對XML文件進行簽章(在對SignedInfo進行簽章時,規範化是強制的)時使用了一種XML規範化的轉換(Canonicalization,通常縮寫為C14n)這些演算法保證邏輯上相同的文件產生完全相同的序列化的表達方式。

預設的規範化演算法處理命名空間生命的方式帶來了另一個問題;通常來說一個被簽章的XML文件需要嵌入另一個文件;在這種情形下,原來的規範化演算法產生的結果與單獨的文件規範化的結果不同。由於這個原因,一個被稱為Exclusive Canonicalization的規範化演算法產生了,該演算法在序列化一個元素的XML命名空間聲明時獨立於該元素所嵌入的XML文件。

好處

與其他形式的數碼簽章,如Pretty Good PrivacyCryptographic Message Syntax相比,XML Signature更加靈活,這是因為它操作的不是二進制數據,而是XML資訊集,允許運算元據的子集,可以以不同形式將簽章與被簽章的資訊結合,以及可以執行轉換。另一個核心概念是標準化,也就是說僅對「精華」進行簽章,而排除了無意義的區別,如白空格和換行符。

缺點

通常,批評都對準XML安全的體系結構[2],以及在簽章和加密XML數據前對XML進行規範化的適宜性,這是因為XML規範化的複雜性,內在的處理需求,以及效能不高的特性[3] [4] [5].爭論在於執行XML標準化會導致額外的等待時間,這對事務的,效能敏感的SOA應用來說簡直難以克服。

這些問題正在XML安全工作群組頁面存檔備份,存於互聯網檔案館)進行解決。 [6] [7]

另一個問題是沒有合適的策略,XML在SOAP中的使用和WS-Security可能導致容易受到攻擊。[8]

參見

參考文獻

  1. ^ http://www.w3.org/TR/xmldsig-filter2/頁面存檔備份,存於互聯網檔案館) XML-Signature XPath Filter 2.0
  2. ^ http://www.cs.auckland.ac.nz/~pgut001/pubs/xmlsec.txt頁面存檔備份,存於互聯網檔案館) Why XML Security is Broken
  3. ^ http://grids.ucs.indiana.edu/ptliupages/publications/WSSPerf.pdf頁面存檔備份,存於互聯網檔案館) Performance of Web Services Security
  4. ^ http://www.extreme.indiana.edu/xgws/papers/sec-perf.pdf頁面存檔備份,存於互聯網檔案館) Performance Comparison of Security Mechanisms for Grid Services
  5. ^ http://www.javaworld.com/javaworld/jw-01-2007/jw-01-vtd.html頁面存檔備份,存於互聯網檔案館) Why XML canonicalization is bad for Web Services Security
  6. ^ http://www.w3.org/2007/xmlsec/ws/report.html頁面存檔備份,存於互聯網檔案館) W3C Workshop on Next Steps for XML Signature and XML Encryption, 2007
  7. ^ http://www.w3.org/TR/xmlsec-reqs2/頁面存檔備份,存於互聯網檔案館) XML Security 2.0 Requirements and Design Considerations
  8. ^ 存档副本 (PDF). [2010-07-20]. (原始內容 (PDF)存檔於2016-03-03). 

外部連結