JavaSE 6基于JSR105的XML簽名之理論篇
XML簽名技術,這項在W3C建議中指定的XML簽名語法及處理方法(XML-Signature Syntax and Processing),成為解決 SOA 開發 中消息級 安全 性方案的基
XML簽名技術,這項在W3C建議中指定的XML簽名語法及處理方法(XML-Signature Syntax and Processing),成為解決
SOA開發中消息級
安全性方案的基礎。被普遍接受的OASIS標準WS-
安全性(WS-Security)正是構建在這一技術(以及XML加密)基礎之上。JSR-105規范又對在
Java平臺應用XML簽名技術進一步標準化,并且將成為即將到來的
Java SE 6發行版本的一個組成部分。本系列文章(《理論篇》與《實踐篇》)將基于
Java SE 6的試發行版本對JSR-105作入門性介紹;在第二篇(即《實踐篇》)中,我們將討論一個具體的應用案例。
一、 數據一致性和消息認證 XML數字簽名的主要目的是確保數據一致性。RFC 2828,因特網安全詞匯表(Internet Security Glossary),把"一致性"定義為"在一種未授權的或偶然方式下確保數據沒有改變、破壞或丟失的屬性"。在這種意義上,與一個校驗和一起存儲或傳遞數據就可以實現數據的一致性。嚴格地說,XML簽名能夠實現比這種一致性更為豐富的內涵-它能夠為在RFC 2828中所謂的消息認證提供支持。
二、 簽名元素結構 實質上,XML簽名使用XML語義描述一個數字簽名。下列層次捕獲頂級的元素和屬性以及它們之間的結構化關系。
clearcase/" target="_blank" >cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
<Signature ID?> ?。糞ignedInfo> ?。糃anonicalizationMethod/> ?。糞ignatureMethod/> (<Reference URI? > (<Transforms>)? ?。糄igestMethod> ?。糄igestValue> ?。?Reference>)+ ?。?SignedInfo> ?。糞ignatureValue> (<KeyInfo>)? (<Object ID?>)* </Signature> |
在這個示例中,?表示零個或一個出現,+表示一個或多個出現,而*表示零或多個出現。在此,所有的元素和屬性被定義于命名空間http://www.w3.org/2000/09/XMLdsig#。
在此,Reference擔當連接要簽名的數據對象與一個XML簽名之間的橋梁作用(通過URI屬性)。一個應用程序選擇這里的digest方法來計算一個數據對象的digest值,并且把這二者作為相應的Reference元素的一部分。
對于digest方法,W3C建議實現對SHA-1的支持。而且,這種實現通常還支持其它交互式單向哈希函數-例如SHA-256,SHA-512和RIPEMD 160。
實際上,我們很少直接從數據對象本身計算一個digest值。通常,一個應用程序需要首先對數據對象應用一些轉換。例如,我們可以使用
XPath來從一個XML文檔中僅提取關鍵元素以實現簽名;或者,我們也可能在使用XSLT經過一些轉換后對一個XML文檔進行簽名。這樣的轉換是在Transforms元素中指定的-其中包含一個有關實現轉換算法及其它相關信息的Transforms的有序列,當然也包括在相應的Reference元素之內。
SignedInfo是數字簽名算法實際應用的元素。該算法通過SignatureMethod元素捕獲;W3C建議中要求實現對DSA_SHA1,RSA_SHA1和HMAC_SHA1(由JSR-105所注釋)的支持。前兩個是基于公鑰的,而HMAC是一種對稱密鑰密碼學算法。