XML Signature
XML signature可以用來簽名任何類型的數據(稱作資源),最常見的是XML文檔,但是任何可以通過URL訪問的資源都可以被簽名。如果XML簽名用於對包含該簽名的XML文檔之外的資源簽名,則稱為detached signature 如果XML簽名用於對包含它的XML文檔的某個部分進行簽名,則稱為enveloped signature; 如果XML簽名包含被簽名的數據,則稱為enveloping signature。
結構
一個XML簽名包含一個Signature元素。基本結構如下所示:
<Signature><SignedInfo><SignatureMethod/><CanonicalizationMethod/><Reference><Transforms><DigestMethod><DigestValue></Reference><Reference/> 等 </SignedInfo><SignatureValue/><KeyInfo/><Object/></Signature>
SignedInfo元素包含或引用簽名後的數據,並指出使用了那種算法。
SignatureMethod和CanonicalizationMethod元素被SignatureValue元素所使用,並包含在SignedInfo元素中以防止篡改。
一個或多個Reference元素通過URI引用的方式說明被簽名的資源;以及在簽名前對資源進行的任何轉換。轉換可以是一個XPath表達式,從文檔樹中選擇一個子集。
DigestMethod元素指定散列算法。
DigestValue元素包含轉換後資源經過散列算法的結果。
SignatureValue元素包含一個經過Base64編碼的簽名結果 - 簽名是按照 SignedInfo元素中的SignatureMethod元素中指明的參數進行的,簽名前要先根據CanonicalizationMethod元素中指定的算法進行規範化。
KeyInfo元素(可選)允許簽名者為接收者提供驗簽該簽名的密鑰,通常是以一個或多個X.509數字證書的形式。如果沒有出現KeyInfo元素,接收方必須從上下文中識別出驗簽的密鑰。
Objec元素(可選)包含被簽名的數據,如果是 enveloping signature(簽名的數據在Signature元素內)的情況。
驗證及安全考慮
當驗證一個XML簽名時,需要遵守一個稱作核心驗證(Core Validation)的程式:
引用驗證: 每一個引用的摘要都通過獲取相應的資源,並且按照指定的轉換方法和摘要方法進行轉換和摘要,然後將結果與DigestValue元素中的內容進行比較,如果不匹配,驗證失敗。
簽名驗證: 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 Privacy和Cryptographic Message Syntax相比,XML Signature更加靈活,這是因為它操作的不是二進制數據,而是XML信息集,允許運算元據的子集,可以以不同形式將簽名與被簽名的信息結合,以及可以執行轉換。另一個核心概念是標準化,也就是說僅對“精華”進行簽名,而排除了無意義的區別,如白空格和換行符。
批評
通常,批評都對準XML安全的體系結構,以及在簽名和加密XML數據前對XML進行規範化的適宜性,這是因為XML規範化的複雜性,內在的處理需求,以及性能不高的特性. 爭論在於執行XML標準化會導致額外的等待時間,這對事務的,性能敏感的SOA套用來說簡直難以克服。這些問題正在XML安全工作組進行解決。另一個問題是沒有合適的策略,XML在SOAP中的使用和WS-Security可能導致容易受到攻擊。