XML Signature（也稱作 XMLDsig，XMLDSig，XMLSig）是一個定義數字簽名的 XML 語法的 W3C 推薦標準。從功能上或，XML Signature 與 PKCS7 有很多共同點，但是 XML 簽名具有更好的可擴充套件性，併為簽名 XML 文件做了調整。XML Signature 在許多 Web 技術，如 SOAP SAML 等中使用。 XML signature 可以用來簽名任何型別的資料（稱作資源），最常見的是 XML 文件，但是任何可以透過 URL 訪問的資源都可以被簽名。如果 XML 簽名用於對包含該簽名的 XML 文件之外的資源簽名，則稱為 detached signature 如果 XML 簽名用於對包含它的 XML 文件的某個部分進行簽名，則稱為 enveloped signature 如果 XML 簽名包含被簽名的資料，則稱為 enveloping signature。 結構 一個 XML 簽名包含一個 Signature 元素，其名字空間為 httpwwww3org200009xmldsig。基本結構如下所示： Signature SignedInfo SignatureMethod CanonicalizationMethod Reference Transforms DigestMethod DigestValue Reference Reference 等 SignedInfo SignatureValue KeyInfo Object Signature SignedInfo 元素包含或引用簽名後的資料，並指出使用了那種演算法。 SignatureMethod 和 CanonicalizationMethod 元素被 SignatureValue 元素所使用，幷包含在 SignedInfo 元素中以防止篡改。 一個或多個 Reference 元素透過 URI 引用的方式說明被簽名的資源；以及在簽名前對資源進行的任何轉換。轉換可以是一個 XPath 表示式，從文件樹中選擇一個子集 httpwwww3orgTRxmldsigfilter2 XMLSignature XPath Filter 20。 DigestMethod 元素指定雜湊演算法。 DigestValue 元素包含轉換後資源經過雜湊演算法的結果。 SignatureValue 元素包含一個經過 Base64 編碼的簽名結果 簽名是按照 SignedInfo 元素中的 SignatureMethod 元素中指明的引數進行的，簽名前要先根據 CanonicalizationMethod 元素中指定的演算法進行規範化。 KeyInfo 元素（可選）允許簽名者為接收者提供驗籤該簽名的金鑰，通常是以一個或多個 X509 數字證書的形式。如果沒有出現 KeyInfo 元素，接收方必須從上下文中識別出驗籤的金鑰。 Object 元素（可選）包含被簽名的資料，如果是 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 安全的體系結構 httpwwwcsaucklandacnzpgut001pubsxmlsectxt Why XML Security is Broken，以及在簽名和加密 XML 資料前對 XML 進行規範化的適宜性，這是因為 XML 規範化的複雜性，內在的處理需求，以及效能不高的特性 httpgridsucsindianaeduptliupagespublicationsWSSPerfpdf Performance of Web Services Security httpwwwextremeindianaeduxgwspaperssecperfpdf Performance Comparison of Security Mechanisms for Grid Services httpwwwjavaworldcomjavaworldjw012007jw01vtdhtml Why XML canonicalization is bad for Web Services Security 爭論在於執行 XML 標準化會導致額外的等待時間，這對事務的，效能敏感的 SOA 應用來說簡直難以克服。 這些問題正在 XML 安全工作組 進行解決。 httpwwww3org2007xmlsecwsreporthtml W3C Workshop on Next Steps for XML Signature and XML Encryption 2007 httpwwww3orgTRxmlsecreqs2 XML Security 20 Requirements and Design Considerations 另一個問題是沒有合適的策略，XML 在 SOAP 中的使用和 WSSecurity 可能導致容易受到攻擊。 參見 Canonical XML XML Encryption XAdES extensions to XMLDSig for use with advanced electronic signature 參考文獻 外部連結 XMLSignature Syntax and Processing W3C Canonical XML Exclusive XML Canonicalization Additional XML Security Uniform Resource Identifiers URIs Category 密碼學標準 Category 基於 XML 的標準