[摘 要] 本文主要研究如何充分利用XML的結(jié)構(gòu)化優(yōu)勢,結(jié)合傳統(tǒng)數(shù)字簽名技術(shù),實現(xiàn)粒度可選的數(shù)字簽名。首先深入研究了XML數(shù)字簽名的規(guī)范,XML數(shù)字簽名的生成原理及驗證方法。并利用跨平臺的Java語言對基于WEB的XML電子定單實現(xiàn)粒度可選的數(shù)字簽名,解析了基于Java的XML數(shù)字簽名的通用實例,使其能夠很方便的融入實際應(yīng)用之中。
[關(guān)鍵詞] XML 數(shù)字簽名 RSA JAVA
一、引言
XML(eXtensible Markup Language,可擴展標記語言)是由W3C于1998年2月發(fā)布的一種標準,是SGML(Standard Generalized Markup Language,標準通用標記語言)的一個簡化子集。XML作為一種描述數(shù)據(jù)的標記語言,以其強大的描述功能、可擴展性、結(jié)構(gòu)化語義,以及平臺無關(guān)性等特點,在互聯(lián)網(wǎng)和分布式異構(gòu)環(huán)境中成為主要的數(shù)據(jù)傳輸和交換載體,在電子商務(wù)等領(lǐng)域得到了廣泛的應(yīng)用。為了確保XML數(shù)據(jù)的安全性,尤其是數(shù)據(jù)的完整性、可驗證性和不可抵賴性,XML數(shù)字簽名技術(shù)應(yīng)運而生。
XML數(shù)字簽名與傳統(tǒng)的數(shù)字簽名技術(shù)相比,并沒有技術(shù)上的飛躍或本質(zhì)上的不同。XML數(shù)字簽名技術(shù)同樣基于目前廣泛使用的公共密鑰體系(Public Key Infrastructure,PKI),用戶基于某種非對稱加密算法,例如:RSA、DSA,用私鑰對要簽署的數(shù)據(jù)簽名,然后接受方用簽名者的公鑰對簽名進行校驗。但不同的是,傳統(tǒng)的數(shù)字簽名技術(shù)一般采用整體式簽名,或基于OLE的對象鏈接嵌入式簽名。傳統(tǒng)的數(shù)字簽名技術(shù)很難支持電子文檔的多人批復簽名,也不支持對電子文檔的部分簽名。XML數(shù)字簽名較好地解決了上述問題。XML數(shù)字簽名充分利用了XML語言本身強大的表達能力和擴展能力,不僅可以像傳統(tǒng)的數(shù)字簽名技術(shù)一樣對整個文檔簽名,還可以實現(xiàn)在較細的粒度上對文檔的特定部分進行簽名,且支持多重簽名。
二、XML數(shù)字簽名規(guī)范
由IETF(Internet Engineering Task Force)和W3C共同組建的XML Signature工作組在2001年8月20日公布了XML數(shù)字簽名的推薦版本。W3C將XML數(shù)字簽名解釋為:定義一種與XML語法兼容的數(shù)字簽名語法描述規(guī)范,描述數(shù)字簽名本身和簽名的生成與驗證過程。作為一個安全有效的數(shù)字簽名方案,該規(guī)范提供了數(shù)字簽名的完整性(Integrity)、簽名確認(Authentication)和不可抵賴性(None repudiation)。其規(guī)范框架及產(chǎn)生流程如圖1所示:
根據(jù)簽名元素和被簽名對象之間的關(guān)系,XML數(shù)字簽名有三種簽名方式:
1.封裝式簽名(Enveloping Signature),被簽名數(shù)據(jù)被封裝在XML簽名元素的內(nèi)部,
2.嵌入式簽名(Enveloped Signature),
3.分離式簽名(Detached Signature),
三、XML數(shù)字簽名的實現(xiàn)
1.XML數(shù)字簽名生成。自從XML數(shù)字簽名規(guī)范發(fā)布以來,很多組織機構(gòu)進行了研究并提供了具體的實現(xiàn)。例如,IBM的AlphaWorks小組開發(fā)了XML安全套件(XML Security Suite),除了提供XML數(shù)字簽名的實現(xiàn)外,還包括了XML的訪問控制、XML加密等功能。NEC專門提供了XML-Signature Software Library對XML數(shù)字簽名進行支持。但是XML安全或數(shù)字簽名套件,很難滿足在各種應(yīng)用程序中對各種各樣實際的XML文檔進行靈活的簽名應(yīng)用。本文將XML數(shù)字簽名與跨平臺的Java語言相結(jié)合,對XML電子訂單文檔實現(xiàn)粒度可選的數(shù)字簽名。實現(xiàn)步驟如下:
(1)生成密鑰對。對于一個用戶來說,如果要進行數(shù)字簽名,那么他必須有一對屬于自己的密鑰對(私鑰和公鑰)。在實際應(yīng)用系統(tǒng)中,密鑰對通常是由CA預(yù)先生成的并存儲在服務(wù)器密鑰庫中,私鑰自己保存和公鑰公開。我們利用Java中提供的工廠類KeyPairGenerator,通過其中的genKeyPair()方法生成密鑰對。
KeyPairGenerator KPG=KeyPairGenerator.getInstance(\"RSA\"); //---創(chuàng)建密鑰對生成器---
KPG.initialize(1024);//---初始化密鑰生成器---
KeyPair KP=KPG.genKeyPair();//---生成密鑰對---
(2)加載解析XML文檔轉(zhuǎn)換為DOM對象。用DOM解析XML文檔操作比較簡便,先將XML文檔讀入內(nèi)存,在內(nèi)存中建立起一棵DOM文檔樹,然后通過對內(nèi)存中DOM文檔樹的操作來完成對XML文檔的操作。加載解析XML文檔并取得根元素的代碼如下:
DocumentBuilderFactory userDBF=DocumentBuilderFactory.newInstance();//---建立一個解析器工廠---
DocumentBuilder userDB=userDBF.newDocumentBuilder(); //---獲得一個DocumentBuilder對象,這個對象代表了具體的DOM解析器
Document doc=userDB.parse(new File(\"invoice.xml\")); //---得到代表invoice.xml文件的文檔對象
Element elementRoot=doc.getDocumentElement(); //---得到根元素---
然后通過Node結(jié)點對象的getChildNodes()方法獲取DOM樹中所需要的子節(jié)點。后面我們創(chuàng)建Reference元素對象、SignedInfo元素對象、KeyInfo元素對象、XMLSignature元素對象都要用到加載的DOM文檔樹。
(3)對XML文檔中的節(jié)點進行可選性簽名。對要簽名的文檔(或節(jié)點)用指定的算法進行轉(zhuǎn)換。如下轉(zhuǎn)換獲得需要簽名的
根據(jù)
try{ MessageDigest MD=MessageDigest.getInstance(\"MD5\");
MD.update(str.getBytes(\"UTF8\"));
byte[] strMD5Byte=MD.digest();
return strMD5Byte;
}catch(Exception e){e.printStackTrace();}
III.收集各個參考對象
IV.建立
FileInputStream FIS=new FileInputStream(\"RSAPriKey.dat\"); //---讀取私鑰---
Signature signature=Signature.getInstance(\"MD5WithRSA\"); //---獲取Signature對象---
signature.initSign(RSAPK); //---初始化Signature對象---
signature.update(mydata.getBytes(\"UTF8\")); //---傳入要簽名的數(shù)據(jù)---
byte[] signeddata=signature.sign();//---用私鑰作簽名---
(4)按照
2.XML數(shù)字簽名驗證。XML數(shù)字簽名的校驗過程分為兩部分進行,參考校驗(Reference Validation)和簽名校驗(Signature Validation)。參考校驗的目的是確保被簽署對象沒有被做任何的修改,驗證在每個
(1)對
(2)對
當上述兩步都成功時,該XML數(shù)字簽名的校驗才算通過。
四、結(jié)束語
隨著XML的廣泛應(yīng)用,XML數(shù)據(jù)的安全問題已成為關(guān)注的焦點。本文主要對XML數(shù)字簽名規(guī)范,XML數(shù)字簽名的生成與驗證過程進行了系統(tǒng)的研究。并結(jié)合XML文檔的結(jié)構(gòu)優(yōu)勢和RSA算法的安全性,利用跨平臺的Java語言對XML文檔實現(xiàn)粒度可選的數(shù)字簽名,并詳細解析了實現(xiàn)過程及關(guān)鍵代碼,使其能夠很方便的融入實際應(yīng)用之中。在文檔部分簽名的實際應(yīng)用當中具有一定的借鑒意義。
參考文獻:
[1]丁躍潮 張 濤:XML實用教程[M].北京:北京大學出版社,2006
[2]韋琳娜 張連寬等:XML數(shù)字簽名和傳統(tǒng)數(shù)字簽名的對比研究[J].信息技術(shù)與標準化,2004,10
[3]張 勇 馮玉才:XML數(shù)字簽名技術(shù)及其在Java中的具體實現(xiàn)[J].計算機應(yīng)用,2003,9
[4]http://www.w3.org/TR/2008/PER-xmldsig-core-20080326/
[5]郭競樂 趙正德等:XML 數(shù)字簽名技術(shù)的研究與實現(xiàn)[J].計算機工程與設(shè)計,2005,05
[6]于國良 韓文報:XML的簽名[J].計算機工程與應(yīng)用,2006,07