• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于XML數(shù)字簽名的研究及實(shí)現(xiàn)

      2009-12-31 00:00:00邢?;?/span>吳淑雷
      商場(chǎng)現(xiàn)代化 2009年8期

      [摘 要] 本文主要研究如何充分利用XML的結(jié)構(gòu)化優(yōu)勢(shì),結(jié)合傳統(tǒng)數(shù)字簽名技術(shù),實(shí)現(xiàn)粒度可選的數(shù)字簽名。首先深入研究了XML數(shù)字簽名的規(guī)范,XML數(shù)字簽名的生成原理及驗(yàn)證方法。并利用跨平臺(tái)的Java語(yǔ)言對(duì)基于WEB的XML電子定單實(shí)現(xiàn)粒度可選的數(shù)字簽名,解析了基于Java的XML數(shù)字簽名的通用實(shí)例,使其能夠很方便的融入實(shí)際應(yīng)用之中。

      [關(guān)鍵詞] XML 數(shù)字簽名 RSA JAVA

      一、引言

      XML(eXtensible Markup Language,可擴(kuò)展標(biāo)記語(yǔ)言)是由W3C于1998年2月發(fā)布的一種標(biāo)準(zhǔn),是SGML(Standard Generalized Markup Language,標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言)的一個(gè)簡(jiǎn)化子集。XML作為一種描述數(shù)據(jù)的標(biāo)記語(yǔ)言,以其強(qiáng)大的描述功能、可擴(kuò)展性、結(jié)構(gòu)化語(yǔ)義,以及平臺(tái)無(wú)關(guān)性等特點(diǎn),在互聯(lián)網(wǎng)和分布式異構(gòu)環(huán)境中成為主要的數(shù)據(jù)傳輸和交換載體,在電子商務(wù)等領(lǐng)域得到了廣泛的應(yīng)用。為了確保XML數(shù)據(jù)的安全性,尤其是數(shù)據(jù)的完整性、可驗(yàn)證性和不可抵賴性,XML數(shù)字簽名技術(shù)應(yīng)運(yùn)而生。

      XML數(shù)字簽名與傳統(tǒng)的數(shù)字簽名技術(shù)相比,并沒(méi)有技術(shù)上的飛躍或本質(zhì)上的不同。XML數(shù)字簽名技術(shù)同樣基于目前廣泛使用的公共密鑰體系(Public Key Infrastructure,PKI),用戶基于某種非對(duì)稱加密算法,例如:RSA、DSA,用私鑰對(duì)要簽署的數(shù)據(jù)簽名,然后接受方用簽名者的公鑰對(duì)簽名進(jìn)行校驗(yàn)。但不同的是,傳統(tǒng)的數(shù)字簽名技術(shù)一般采用整體式簽名,或基于OLE的對(duì)象鏈接嵌入式簽名。傳統(tǒng)的數(shù)字簽名技術(shù)很難支持電子文檔的多人批復(fù)簽名,也不支持對(duì)電子文檔的部分簽名。XML數(shù)字簽名較好地解決了上述問(wèn)題。XML數(shù)字簽名充分利用了XML語(yǔ)言本身強(qiáng)大的表達(dá)能力和擴(kuò)展能力,不僅可以像傳統(tǒng)的數(shù)字簽名技術(shù)一樣對(duì)整個(gè)文檔簽名,還可以實(shí)現(xiàn)在較細(xì)的粒度上對(duì)文檔的特定部分進(jìn)行簽名,且支持多重簽名。

      二、XML數(shù)字簽名規(guī)范

      由IETF(Internet Engineering Task Force)和W3C共同組建的XML Signature工作組在2001年8月20日公布了XML數(shù)字簽名的推薦版本。W3C將XML數(shù)字簽名解釋為:定義一種與XML語(yǔ)法兼容的數(shù)字簽名語(yǔ)法描述規(guī)范,描述數(shù)字簽名本身和簽名的生成與驗(yàn)證過(guò)程。作為一個(gè)安全有效的數(shù)字簽名方案,該規(guī)范提供了數(shù)字簽名的完整性(Integrity)、簽名確認(rèn)(Authentication)和不可抵賴性(None repudiation)。其規(guī)范框架及產(chǎn)生流程如圖1所示:

      根據(jù)簽名元素和被簽名對(duì)象之間的關(guān)系,XML數(shù)字簽名有三種簽名方式:

      1.封裝式簽名(Enveloping Signature),被簽名數(shù)據(jù)被封裝在XML簽名元素的內(nèi)部,元素類似于一個(gè)信封,將簽名的數(shù)據(jù)封在里面。

      2.嵌入式簽名(Enveloped Signature),元素本身被嵌入到被簽名數(shù)據(jù)中,與封裝式相反,被簽名的數(shù)據(jù)充當(dāng)了包含簽名的“信封”。

      3.分離式簽名(Detached Signature),元素和被簽名數(shù)據(jù)是彼此分離的,兩者之間不存在包含和被包含的關(guān)系。被簽名的數(shù)據(jù)可以是獨(dú)立的外部文檔,也可以是跟Signature元素位于同一XML文檔內(nèi)的并列的兄弟元素。

      三、XML數(shù)字簽名的實(shí)現(xiàn)

      1.XML數(shù)字簽名生成。自從XML數(shù)字簽名規(guī)范發(fā)布以來(lái),很多組織機(jī)構(gòu)進(jìn)行了研究并提供了具體的實(shí)現(xiàn)。例如,IBM的AlphaWorks小組開(kāi)發(fā)了XML安全套件(XML Security Suite),除了提供XML數(shù)字簽名的實(shí)現(xiàn)外,還包括了XML的訪問(wèn)控制、XML加密等功能。NEC專門提供了XML-Signature Software Library對(duì)XML數(shù)字簽名進(jìn)行支持。但是XML安全或數(shù)字簽名套件,很難滿足在各種應(yīng)用程序中對(duì)各種各樣實(shí)際的XML文檔進(jìn)行靈活的簽名應(yīng)用。本文將XML數(shù)字簽名與跨平臺(tái)的Java語(yǔ)言相結(jié)合,對(duì)XML電子訂單文檔實(shí)現(xiàn)粒度可選的數(shù)字簽名。實(shí)現(xiàn)步驟如下:

      (1)生成密鑰對(duì)。對(duì)于一個(gè)用戶來(lái)說(shuō),如果要進(jìn)行數(shù)字簽名,那么他必須有一對(duì)屬于自己的密鑰對(duì)(私鑰和公鑰)。在實(shí)際應(yīng)用系統(tǒng)中,密鑰對(duì)通常是由CA預(yù)先生成的并存儲(chǔ)在服務(wù)器密鑰庫(kù)中,私鑰自己保存和公鑰公開(kāi)。我們利用Java中提供的工廠類KeyPairGenerator,通過(guò)其中的genKeyPair()方法生成密鑰對(duì)。

      KeyPairGenerator KPG=KeyPairGenerator.getInstance(\"RSA\"); //---創(chuàng)建密鑰對(duì)生成器---

      KPG.initialize(1024);//---初始化密鑰生成器---

      KeyPair KP=KPG.genKeyPair();//---生成密鑰對(duì)---

      (2)加載解析XML文檔轉(zhuǎn)換為DOM對(duì)象。用DOM解析XML文檔操作比較簡(jiǎn)便,先將XML文檔讀入內(nèi)存,在內(nèi)存中建立起一棵DOM文檔樹(shù),然后通過(guò)對(duì)內(nèi)存中DOM文檔樹(shù)的操作來(lái)完成對(duì)XML文檔的操作。加載解析XML文檔并取得根元素的代碼如下:

      DocumentBuilderFactory userDBF=DocumentBuilderFactory.newInstance();//---建立一個(gè)解析器工廠---

      DocumentBuilder userDB=userDBF.newDocumentBuilder(); //---獲得一個(gè)DocumentBuilder對(duì)象,這個(gè)對(duì)象代表了具體的DOM解析器

      Document doc=userDB.parse(new File(\"invoice.xml\")); //---得到代表invoice.xml文件的文檔對(duì)象

      Element elementRoot=doc.getDocumentElement(); //---得到根元素---

      然后通過(guò)Node結(jié)點(diǎn)對(duì)象的getChildNodes()方法獲取DOM樹(shù)中所需要的子節(jié)點(diǎn)。后面我們創(chuàng)建Reference元素對(duì)象、SignedInfo元素對(duì)象、KeyInfo元素對(duì)象、XMLSignature元素對(duì)象都要用到加載的DOM文檔樹(shù)。

      (3)對(duì)XML文檔中的節(jié)點(diǎn)進(jìn)行可選性簽名。對(duì)要簽名的文檔(或節(jié)點(diǎn))用指定的算法進(jìn)行轉(zhuǎn)換。如下轉(zhuǎn)換獲得需要簽名的節(jié)點(diǎn):

      descendant-or-self::creditcard

      根據(jù)指定的算法對(duì)轉(zhuǎn)換后的結(jié)果進(jìn)行摘要計(jì)算,結(jié)果存入。JAVA中提供了比較成熟的計(jì)算摘要的算法,MessageDigest是工廠類,用靜態(tài)方法getInstance()來(lái)生成對(duì)象,傳入?yún)?shù)是String類型,用于指出計(jì)算摘要使用的算法。摘要計(jì)算的核心代碼如下:

      try{ MessageDigest MD=MessageDigest.getInstance(\"MD5\");

      MD.update(str.getBytes(\"UTF8\"));

      byte[] strMD5Byte=MD.digest();

      return strMD5Byte;

      }catch(Exception e){e.printStackTrace();}

      III.收集各個(gè)參考對(duì)象元素,該元素包括: ,,建立

      IV.建立元素并進(jìn)行規(guī)范化處理后簽名。讀取私鑰并簽名的關(guān)鍵代碼:

      FileInputStream FIS=new FileInputStream(\"RSAPriKey.dat\"); //---讀取私鑰---

      Signature signature=Signature.getInstance(\"MD5WithRSA\"); //---獲取Signature對(duì)象---

      signature.initSign(RSAPK); //---初始化Signature對(duì)象---

      signature.update(mydata.getBytes(\"UTF8\")); //---傳入要簽名的數(shù)據(jù)---

      byte[] signeddata=signature.sign();//---用私鑰作簽名---

      (4)按照中指定的算法對(duì)元素進(jìn)行簽名操作,將簽名結(jié)果存入節(jié)點(diǎn)。建立元素,該元素包括、。最后,將各個(gè)元素添加入XML文檔,生成XML簽名文檔。運(yùn)用JAVA語(yǔ)言對(duì)下圖中的XML電子訂單文檔實(shí)現(xiàn)了XML文檔節(jié)點(diǎn)可選性的數(shù)字簽名,結(jié)合上述簽名過(guò)程解析,對(duì)結(jié)點(diǎn)進(jìn)行簽名的實(shí)現(xiàn)結(jié)果如下圖所示:

      2.XML數(shù)字簽名驗(yàn)證。XML數(shù)字簽名的校驗(yàn)過(guò)程分為兩部分進(jìn)行,參考校驗(yàn)(Reference Validation)和簽名校驗(yàn)(Signature Validation)。參考校驗(yàn)的目的是確保被簽署對(duì)象沒(méi)有被做任何的修改,驗(yàn)證在每個(gè)元素的元素中進(jìn)行;而簽名校驗(yàn)的目的則是保證簽署人身份的真實(shí)性,驗(yàn)證利用元素計(jì)算得來(lái)的簽名。

      (1)對(duì)簽名校驗(yàn)(參考校驗(yàn))。對(duì)簽名校驗(yàn)通過(guò)計(jì)算元素中的每一個(gè)元素,與元素中已包含的摘要值進(jìn)行比較。

      (2)對(duì)簽名校驗(yàn)(簽名校驗(yàn))。對(duì)的簽名校驗(yàn),用指定的算法重新計(jì)算元素的簽名值,將生成的值和中已有的簽名值進(jìn)行比較。

      當(dāng)上述兩步都成功時(shí),該XML數(shù)字簽名的校驗(yàn)才算通過(guò)。

      四、結(jié)束語(yǔ)

      隨著XML的廣泛應(yīng)用,XML數(shù)據(jù)的安全問(wèn)題已成為關(guān)注的焦點(diǎn)。本文主要對(duì)XML數(shù)字簽名規(guī)范,XML數(shù)字簽名的生成與驗(yàn)證過(guò)程進(jìn)行了系統(tǒng)的研究。并結(jié)合XML文檔的結(jié)構(gòu)優(yōu)勢(shì)和RSA算法的安全性,利用跨平臺(tái)的Java語(yǔ)言對(duì)XML文檔實(shí)現(xiàn)粒度可選的數(shù)字簽名,并詳細(xì)解析了實(shí)現(xiàn)過(guò)程及關(guān)鍵代碼,使其能夠很方便的融入實(shí)際應(yīng)用之中。在文檔部分簽名的實(shí)際應(yīng)用當(dāng)中具有一定的借鑒意義。

      參考文獻(xiàn):

      [1]丁躍潮 張 濤:XML實(shí)用教程[M].北京:北京大學(xué)出版社,2006

      [2]韋琳娜 張連寬等:XML數(shù)字簽名和傳統(tǒng)數(shù)字簽名的對(duì)比研究[J].信息技術(shù)與標(biāo)準(zhǔn)化,2004,10

      [3]張 勇 馮玉才:XML數(shù)字簽名技術(shù)及其在Java中的具體實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用,2003,9

      [4]http://www.w3.org/TR/2008/PER-xmldsig-core-20080326/

      [5]郭競(jìng)樂(lè) 趙正德等:XML 數(shù)字簽名技術(shù)的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2005,05

      [6]于國(guó)良 韓文報(bào):XML的簽名[J].計(jì)算機(jī)工程與應(yīng)用,2006,07

      海兴县| 田东县| 佛冈县| 从化市| 通州市| 陇西县| 呼玛县| 安岳县| 天峻县| 扬州市| 巴青县| 玉田县| 庆元县| 临沧市| 达拉特旗| 冷水江市| 黄梅县| 星子县| 县级市| 祥云县| 温泉县| 庄河市| 松滋市| 安福县| 昭平县| 灵石县| 黑龙江省| 文成县| 陆川县| 舞阳县| 磐安县| 克山县| 白山市| 乡宁县| 石河子市| 大兴区| 乌兰县| 湾仔区| 大荔县| 横峰县| 介休市|