<Expiration>04/02</Expiration>
</CreditCard>
</PaymentInfo>
可能還有必要加密文檔中的所有信息,清單 4 演示了這點。
清單 4. 隱藏了全部內容的加密文檔
<?xml version='1.0'?>
<EncryptedData xmlns='http://www.w3.org/2001/04/xmlenc#'
Type='http://www.isi.edu/in-notes/iana/assignments/media-types/text/xml'>
<CipherData><CipherValue>A23B45C56</CipherValue></CipherData>
</EncryptedData>
CipherData 可以封裝,也可以引用原始加密數據。在第一種情況下,CipherValue 元素的內容顯示原始數據,而在第二種情況,使用 CipherReference 元素,這包括了一個指向加密數據位置的 URI。
規范的 XML
對應用了密碼散列算法的消息進行最輕微的更改也會產生不同的值。這為消息完整性方面提供了信任,並適於通常用法,但是也引入了進一步的復雜性 — 兩個 XML 文檔雖然在邏輯上相等,但可能在確切文本比較中不同。象行定界符、空標記、在屬性中使用十六進制而不是名稱以及在特定情況下存在注釋或注釋變體這樣的事情都可以成為文檔的邏輯結構不受影響而實際彼此不同的實例。規范的 XML 規范描述了一種生成文檔的物理表示(也成為范式)的方法,該范式解釋允許的變體,以便如果兩個文檔具有同一范式,則認為兩個文檔在給定應用程序上下文中是邏輯相等的。
對於加密、特別是數字簽名來說,這尤為重要,因為很明顯,邏輯上相同的文本變體不應該表示文檔的完整性及其發送方的認證是可疑的。用不同工具(譬如,解析器)生成不同文本(並因而生成不同消息摘要)進行處理時也可能發生這樣的事。因此,在生成簽名和驗證計算期間,應該在范式上進行消息摘要。如果摘要匹配,這將確定:即使文本形式可能不同,它們在其上計算的范式也匹配。
XML 簽名示例
可以將 XML 簽名應用到任意數據內容。那些應用到相同 XML 文檔中數據的簽名稱為封裝或被封裝的簽名,而那些數據在簽名元素外部的簽名稱為分離簽名。清單 5 取自簽名候選推薦文檔,它是一個簡單分離簽名的實例。
清單 5. 一個簡單分離簽名的示例
[s01] <Signature Id="MyFirstSignature"
xmlns="http://www.w3.org/2000/09/xmldsig#">
[s02] <SignedInfo>
[s03] <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/
REC-xml-c14n-20010315"/>
[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] <Transforms>
[s07] <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-
20010315"/>
[s08] </Transforms>
[s09] <DigestMethod Algorithm="http://www.w3.org/2000/09/
xmldsig#sha1"/>
[s10] <DigestValue>j6lwx3rvEPO0vKtMup4NbeVu8nk=</DigestValue>