電子公文中XML加密的應(yīng)用

針對(duì)電子政務(wù)中對(duì)電子公文保密的需求,特別是XML在電子商務(wù)和電子政務(wù)等領(lǐng)域有廣泛的應(yīng)用,為此我們今天就來談?wù)劵赬ML格式的電子公文是如何實(shí)現(xiàn)XML加密的。

一、XML加密規(guī)范

要了解XML加密規(guī)范的所有信息,可以在http://www.w3.org/TR/xmlenc-core站點(diǎn)上查閱(XML Encryption Syntax andProccssing)。

XML加密語法使用元素表示加密,其基本結(jié)構(gòu)如下:

在該基本結(jié)構(gòu)中,“?”表示O次或1次出現(xiàn),“+”表示1次或多次出現(xiàn),“*”表示0次或多次出現(xiàn)。

(1)EncryptedData元素是密封(包含或引用)加密數(shù)據(jù)和解密所需相關(guān)信息(如私鑰信息和所使用的加密算法)的最外層元素。如果該元素是XML文檔的根元素,則整個(gè)文檔都被加密。單個(gè)XML文檔可能同時(shí)含有多個(gè)EncryptedData元素,但其中任一個(gè)EncryptedData元素都不能是另一個(gè)EncryptedData元素的父元素或子元素。

(2)EncryptionMethod元素是EncryptedData元素的子元素,使用XML加密規(guī)范中定義的算法標(biāo)識(shí)符描述了所采用的加密算法,如果沒有提供這個(gè)元素,那么參與XML加密的應(yīng)用程序一定以某種方式共享或者隱含知道所使用的加密算法。

(3)ds:Keylnfo元素是EnctypkdData元素的子元素,該元素提供用于加密和解密數(shù)據(jù)的對(duì)稱密鑰,如果沒有提供這個(gè)元素,那么參與XML加密的應(yīng)用程序一定以某種方式共享或者隱含知道所使用的密鑰。

(4)EncryptedKey元素是ds:Keylnfo元素的子元素,該元素用于交換對(duì)稱密鑰。

(5)AgreementMcthod元素是ds: Kcylnfo元素的子元素,該元素用于建立一個(gè)應(yīng)用程序定義的、共享密鑰的方法。如果缺少這個(gè)元素,應(yīng)用程序必須以某種方式來處理密鑰交換協(xié)議。

(6)ds: KeyNamc元素是ds: Kcylnfo元素的子元素,可以選擇使用該元素來訪問具有易懂名字的密鑰。

(7)ds:RctricvaIKcy元素是ds:Kcylnfo元素的子元素,該元素提供到另一個(gè)含有密鑰的EncryptedKey元素的URI鏈接。

(8)CipherData元素是EncryptedData元素的必要子元素,該元素包含或引用實(shí)際的加密數(shù)據(jù)。如果這個(gè)元素包含加密的數(shù)據(jù),就會(huì)使用一個(gè)CipherValue子元素l如果這個(gè)元素引用加密的數(shù)據(jù),就會(huì)使用一個(gè)CipherRcfercncc子元素。

(9)CiphcrValuc元素密封了實(shí)際的加密數(shù)據(jù)。

(1O)CipherReferencc元素密封了對(duì)外部加密數(shù)據(jù)的引用。

(11)EncrypoonPropertcs元素提供了應(yīng)用程序?qū)S玫母郊有畔ⅰ?/p>

XML加密組合使用了對(duì)稱密碼和非對(duì)稱密碼算法。對(duì)稱密碼算法用于XML數(shù)據(jù)的批量加密,非對(duì)稱密碼算法則用于安全地交換對(duì)稱密鑰。加密和解密的基本工作原理如下:

(1)接收方生成一個(gè)非對(duì)稱密鑰對(duì),其中一個(gè)用作公鑰,另一個(gè)用作私鑰;

(2)發(fā)送方可以通過非安全的方式獲取接收方的公鑰,如果需要驗(yàn)證公鑰,發(fā)送方還可以通過認(rèn)證機(jī)構(gòu)獲取接收方的公鑰;

(3)發(fā)送方生成一個(gè)秘密的對(duì)稱密鑰;

(4)發(fā)送方用這個(gè)對(duì)稱密鑰加密XML文檔中的預(yù)定元素;

(5)發(fā)送方使用接收方的公鑰加密這個(gè)對(duì)稱密鑰;

(6)發(fā)送方將加密的數(shù)據(jù)、加密的對(duì)稱密鑰以及可選信息結(jié)合在一起,生成一個(gè)新的加密的XML文檔;

(7)發(fā)送方將加密的XML文檔發(fā)送給接收方;

(8)接收方析取出加密的數(shù)據(jù)、加密的對(duì)稱密鑰和可能需要的任何附加可選信息;

(9)接收方使用正確的非對(duì)稱密碼算法和自己保管的私鑰來解密對(duì)稱密鑰;

(10)接收方使用解密的對(duì)稱密鑰來解密XML文檔中被加密的元素。

二、XML加密在電子公文中的應(yīng)用

1、系統(tǒng)結(jié)構(gòu)

本系統(tǒng)采用B/S構(gòu)架,客戶端使用Web應(yīng)用程序訪問Web服務(wù)器,通過Web服務(wù)器訪問CA服務(wù)器或數(shù)據(jù)庫服務(wù)器。Web服務(wù)器提供文檔中轉(zhuǎn)、發(fā)布和訪問CA服務(wù)器與數(shù)據(jù)庫服務(wù)器;CA服務(wù)器提供安全注冊(cè)、頒發(fā)證書和撤銷證書。數(shù)據(jù)庫服務(wù)器存儲(chǔ)各種格式的數(shù)據(jù),如數(shù)據(jù)庫、XML文檔等。用戶通過客戶端向CA服務(wù)器進(jìn)行注冊(cè)獲取自己的證書,或者通過CA服務(wù)器查詢其他客戶的證書或撤銷列表來獲取他們的證書。發(fā)送方從接收方的證書獲取他的公鑰,對(duì)生成的XML文檔加密后,通過Web服務(wù)器提交到數(shù)據(jù)庫服務(wù)器分類存儲(chǔ);接收方通過Web服務(wù)器查詢到相應(yīng)的XML文檔,用自己證書的私鑰,對(duì)已加密的XML文檔進(jìn)行驗(yàn)證。

2、CA服務(wù)器

一般說來,實(shí)現(xiàn)CA服務(wù)器有3種方案。第1種是以用戶為中心的管理,每個(gè)用戶自己產(chǎn)生密鑰對(duì)、簽發(fā)公鑰證書、維護(hù)信任鏈。這種方式對(duì)較小的應(yīng)用系統(tǒng)或者對(duì)安全性要求不高的情況來說是有效的,比如PGP就是用這種方式,第2種方案是采用商業(yè)網(wǎng)站的CA服務(wù),這是目前量為廣泛使用的方式。比較有名的商業(yè)CA公司有美國的VeriSign,GTE Cybcr-Trust,中國金融認(rèn)證中心FCA等。第3種方案是建立專用的公鑰基礎(chǔ)設(shè)施PKI,實(shí)現(xiàn)公鑰管理的自動(dòng)化。可采用商用PKI系統(tǒng)如eTrust PKI,或者使用開放源碼PKI項(xiàng)目。

微軟Windows 2000 Server將一個(gè)綜合的PKI引入到windows平臺(tái),作為其安全機(jī)制,并且提供了一整套服務(wù)和管理工具,以創(chuàng)建、部署和管理基于PKI的應(yīng)用系統(tǒng)。Windows 2000Server PKI在提供高強(qiáng)度安全性的同時(shí),還與操作系統(tǒng)緊密集成,并作為操作系統(tǒng)的一項(xiàng)基本服務(wù)而存在,避免了購買第3方PKI所帶來的額外開銷,同時(shí)也保證了系統(tǒng)兼容性。

本系統(tǒng)采用Windows 2000 Sewcr PKI作為一個(gè)內(nèi)部CA服務(wù)器頒布證書和撤銷證書。

3、獲取證書中的信息

(1)Wcb Scrvices Enhanccmcnts for.NET

盡管.NET Framework中有System. Security. Cryptogj'aphy.X509Ccrtes命名空間,但它并不包括任何證書存儲(chǔ)類,受到的限制很多.Web Scnriccs Enhancemcnts for .NET(WSE)是一個(gè)新的.NET類庫,這個(gè)類庫實(shí)現(xiàn)了量新的Web服務(wù)協(xié)議。使用WSE可以從Windows客戶端的證書存儲(chǔ)單元中檢索證書,從證書中獲取密鑰,用它來執(zhí)行XML加密。

WSE可以從bttp://msdn.microsoft.com/websewiccs/webser-vices/building/wse/下載。

(2)系統(tǒng)存儲(chǔ)區(qū)和證書存儲(chǔ)單元

Windows客戶端上的系統(tǒng)存儲(chǔ)區(qū)描述了可從中進(jìn)行證書存儲(chǔ)的上下文。

WSE支持的每個(gè)系統(tǒng)存儲(chǔ)區(qū)至少有4個(gè)預(yù)定義的證書存儲(chǔ)單元:

①M(fèi)y包含個(gè)人證書和對(duì)個(gè)人密鑰的引用;

②CA包含根證書和最終實(shí)體證書之間的證書;

③Trust包含可信的第3方的證書;

④Root包含根證書,必須使該存儲(chǔ)單元安全,因?yàn)樗峁┝俗C書鏈中最重要的部分。

(3)獲取證書

我們可以通過獲取證書存儲(chǔ)單元中的證書,生成密鑰。

C#示例代碼如下:

using System;

using Systcm.Sccurity.Cryptograpby;

using MiceosoR Web.Scrviccs.Security.X509;

//使用WSE的功能查找證書

X509CcrtificateStorc store;ncw X509CertificateStorc.Cur-rentUscrStore(

X509CertificateStore.MyStore);

store.OpenRcad0;

X509Certificate cert= (X509Ccrtificate)store.Certificates[0l;store.Closc();

//獲取證書的密鑰信息

RSAParamcters Key-c crt Key.ExportParameters(true);

RSACryptoServiceProvider key= ncw RSACryptoServiccPro-vide();

kcy.lmportParamcters(Kcy);

4、XML加密的編程實(shí)現(xiàn)

微軟公司在其.NET平臺(tái)中對(duì)XML加密提供了支持。可以使用.NET Framework的System.Xml命名空間中的類和Sys-tem.Security.Cryptograpby命名空間中的類對(duì)XML文檔進(jìn)行加密.XML加密中使用的類如下。

(1)XmIDocument類.System. Xml命名空間中定義的XmIDocumcnt類表示XML文檔。XmIDocumffit類由XmINode類派生。

(2)XmIElcment類.System.Xml命名空間中定義的XmIElemcnt類用于表示文檔中的XML元素.XmIElcment類由XmILinkedNode類派生,而XmILinkedNode類又是由XmINode類派生的。

(3)XmIAttributc類.System.Xml命名空間中定義的XmIAtt-ribute類表示XML元素的屬性。

(4)TripleDESCryptoScwiceProvider類。System. Sccurity.Cryptography命名空間中定義的TriplcDESCryptoScwiceProvi-der類使用TripleDES算法對(duì)XML文檔進(jìn)行加密和解密。

(5)RSACryptoScrviceProvider類.System.Security.Cryptogra-phy命名空間中定義的RSACrypcoScrviceProvider類使用RSA算法對(duì)TripleDES算法產(chǎn)生的對(duì)稱密鑰進(jìn)行加密和解密。

(6)Convert類.進(jìn)行加密操作時(shí),通常處理以字節(jié)數(shù)組形式存在的數(shù)據(jù),在處理XML數(shù)據(jù)時(shí),總是處理以文本串形式式存在的數(shù)據(jù)。在處理XML數(shù)據(jù)時(shí),總是處理以文本串形式存在的數(shù)據(jù)。為解決這個(gè)差異,就必須在這兩種數(shù)據(jù)類型之間進(jìn)行轉(zhuǎn)換.Con\rcrt類提供了轉(zhuǎn)換方法。

我們編寫的sender.cs和receIvcr.cs程序?qū)崿F(xiàn)了發(fā)送方加密XML文檔并向接收方發(fā)送加密結(jié)果的典型情況。

接收方的EstablishXmIRsaParametcrs方法獲取Windows客戶端的證書信息,建立RSA非對(duì)稱密鑰對(duì)并存放在兩個(gè)文件中。RsalncludcPriVatcParams.xml文件含有公鑰和私鑰信息,這個(gè)XML文件絕對(duì)不能泄露,必須保證非授權(quán)用戶無法訪問這個(gè)XML文件.RsaExcludePrivateParams.xml只含有公鑰信息。

rccciver. EstablishXmIRsaParamctcrs(”RsalncludePrivate-Params.xml“,“RsaExcludePrivateParams.xml");

發(fā)送方的CreateAndEnayptXmIScssionKcy方法建立用于XML加密的TripleDES對(duì)稱會(huì)話密鑰,使用RsaExcludcPriVate-Params.xml中的公鑰,對(duì)該對(duì)稱密鑰加密,結(jié)果存放在文件SessionKeyExchangc,xml中。

byte[]IVpsender.CreateAndEncryptXmISessionKcy(—RsaEx-cludePrMrteParams.xml“,一SessionKeyExcbange.xml");

發(fā)送方的EncryptOriginalXmIDocumcnt方法用存放在文件SessionKcyExcbange.xml中的對(duì)稱密鑰對(duì)XMl文檔(Ori81-MI.Xml)加密,結(jié)果存盤(Encrypted.xml).scndcr.EncryptOriginaIXmIDocumcnt COriginal.xml”,’‘Ses-sionKcyExcbange.xml¨,一Encrypted.xml");

接收方的DecyptXmjDocumcut方法用存放在文件Scs-sionKcyExchange.xml中的對(duì)稱密鑰和文件RsalncludePrivate-Params.xml中的公鑰和私鑰對(duì)加密的XML文檔(Encrypted.xml)解密,結(jié)果存盤(Dccrypted.xml)。

rcccivcr. DccryptXmIDocument(‘Encrypted.xml",’Rsalnclu-dePrivateParams.xmI",NSessionKeyExcbange.xml_,“Decryp-ted.xmI",IV);

5、結(jié)合合XML加密和XML數(shù)字簽名

將XML加密和XML數(shù)字簽名這兩種操作結(jié)合在一起是可行的,如果加密和簽名同一個(gè)XML文檔,這兩種操作的順序就非常重要。應(yīng)用程序必須區(qū)分加密操作在簽名操作前還是在簽名操作后完成。如果在簽名前執(zhí)行加密操作,就必須在驗(yàn)證簽名后執(zhí)行解密操作,這是因?yàn)槿绻冉饷?,未加密的簽名?huì)出現(xiàn)錯(cuò)誤,這樣就無法進(jìn)行驗(yàn)證簽名的操作,相反,如果在簽名后執(zhí)行加密操作,就必須在驗(yàn)證簽名前解密文擋。

小知識(shí)之XML

XML,是一種標(biāo)記語言。標(biāo)記指計(jì)算機(jī)所能理解的信息符號(hào),通過此種標(biāo)記,計(jì)算機(jī)之間可以處理包含各種信息的文章等。如何定義這些標(biāo)記,既可以選擇國際通用的標(biāo)記語言,比如HTML,也可以使用像XML這樣由相關(guān)人士自由決定的標(biāo)記語言,這就是語言的可擴(kuò)展性。XML是從標(biāo)準(zhǔn)通用標(biāo)記語言(SGML)中簡(jiǎn)化修改出來的。它主要用到的有可擴(kuò)展標(biāo)記語言、可擴(kuò)展樣式語言(XSL)、XBRL和XPath等。