電子公文中XML加密的應用
針對電子政務中對電子公文保密的需求,特別是XML在電子商務和電子政務等領域有廣泛的應用,為此我們今天就來談談基于XML格式的電子公文是如何實現(xiàn)XML加密的。
一、XML加密規(guī)范
要了解XML加密規(guī)范的所有信息,可以在http://www.w3.org/TR/xmlenc-core站點上查閱(XML Encryption Syntax andProccssing)。
XML加密語法使用元素表示加密,其基本結構如下:
在該基本結構中,“?”表示O次或1次出現(xiàn),“+”表示1次或多次出現(xiàn),“*”表示0次或多次出現(xiàn)。
(1)EncryptedData元素是密封(包含或引用)加密數(shù)據和解密所需相關信息(如私鑰信息和所使用的加密算法)的最外層元素。如果該元素是XML文檔的根元素,則整個文檔都被加密。單個XML文檔可能同時含有多個EncryptedData元素,但其中任一個EncryptedData元素都不能是另一個EncryptedData元素的父元素或子元素。
(2)EncryptionMethod元素是EncryptedData元素的子元素,使用XML加密規(guī)范中定義的算法標識符描述了所采用的加密算法,如果沒有提供這個元素,那么參與XML加密的應用程序一定以某種方式共享或者隱含知道所使用的加密算法。
(3)ds:Keylnfo元素是EnctypkdData元素的子元素,該元素提供用于加密和解密數(shù)據的對稱密鑰,如果沒有提供這個元素,那么參與XML加密的應用程序一定以某種方式共享或者隱含知道所使用的密鑰。
(4)EncryptedKey元素是ds:Keylnfo元素的子元素,該元素用于交換對稱密鑰。
(5)AgreementMcthod元素是ds: Kcylnfo元素的子元素,該元素用于建立一個應用程序定義的、共享密鑰的方法。如果缺少這個元素,應用程序必須以某種方式來處理密鑰交換協(xié)議。
(6)ds: KeyNamc元素是ds: Kcylnfo元素的子元素,可以選擇使用該元素來訪問具有易懂名字的密鑰。
(7)ds:RctricvaIKcy元素是ds:Kcylnfo元素的子元素,該元素提供到另一個含有密鑰的EncryptedKey元素的URI鏈接。
(8)CipherData元素是EncryptedData元素的必要子元素,該元素包含或引用實際的加密數(shù)據。如果這個元素包含加密的數(shù)據,就會使用一個CipherValue子元素l如果這個元素引用加密的數(shù)據,就會使用一個CipherRcfercncc子元素。
(9)CiphcrValuc元素密封了實際的加密數(shù)據。
(1O)CipherReferencc元素密封了對外部加密數(shù)據的引用。
(11)EncrypoonPropertcs元素提供了應用程序專用的附加信息。
XML加密組合使用了對稱密碼和非對稱密碼算法。對稱密碼算法用于XML數(shù)據的批量加密,非對稱密碼算法則用于安全地交換對稱密鑰。加密和解密的基本工作原理如下:
(1)接收方生成一個非對稱密鑰對,其中一個用作公鑰,另一個用作私鑰;
(2)發(fā)送方可以通過非安全的方式獲取接收方的公鑰,如果需要驗證公鑰,發(fā)送方還可以通過認證機構獲取接收方的公鑰;
(3)發(fā)送方生成一個秘密的對稱密鑰;
(4)發(fā)送方用這個對稱密鑰加密XML文檔中的預定元素;
(5)發(fā)送方使用接收方的公鑰加密這個對稱密鑰;
(6)發(fā)送方將加密的數(shù)據、加密的對稱密鑰以及可選信息結合在一起,生成一個新的加密的XML文檔;
(7)發(fā)送方將加密的XML文檔發(fā)送給接收方;
(8)接收方析取出加密的數(shù)據、加密的對稱密鑰和可能需要的任何附加可選信息;
(9)接收方使用正確的非對稱密碼算法和自己保管的私鑰來解密對稱密鑰;
(10)接收方使用解密的對稱密鑰來解密XML文檔中被加密的元素。
二、XML加密在電子公文中的應用
1、系統(tǒng)結構
本系統(tǒng)采用B/S構架,客戶端使用Web應用程序訪問Web服務器,通過Web服務器訪問CA服務器或數(shù)據庫服務器。Web服務器提供文檔中轉、發(fā)布和訪問CA服務器與數(shù)據庫服務器;CA服務器提供安全注冊、頒發(fā)證書和撤銷證書。數(shù)據庫服務器存儲各種格式的數(shù)據,如數(shù)據庫、XML文檔等。用戶通過客戶端向CA服務器進行注冊獲取自己的證書,或者通過CA服務器查詢其他客戶的證書或撤銷列表來獲取他們的證書。發(fā)送方從接收方的證書獲取他的公鑰,對生成的XML文檔加密后,通過Web服務器提交到數(shù)據庫服務器分類存儲;接收方通過Web服務器查詢到相應的XML文檔,用自己證書的私鑰,對已加密的XML文檔進行驗證。
2、CA服務器
一般說來,實現(xiàn)CA服務器有3種方案。第1種是以用戶為中心的管理,每個用戶自己產生密鑰對、簽發(fā)公鑰證書、維護信任鏈。這種方式對較小的應用系統(tǒng)或者對安全性要求不高的情況來說是有效的,比如PGP就是用這種方式,第2種方案是采用商業(yè)網站的CA服務,這是目前量為廣泛使用的方式。比較有名的商業(yè)CA公司有美國的VeriSign,GTE Cybcr-Trust,中國金融認證中心FCA等。第3種方案是建立專用的公鑰基礎設施PKI,實現(xiàn)公鑰管理的自動化??刹捎蒙逃肞KI系統(tǒng)如eTrust PKI,或者使用開放源碼PKI項目。
微軟Windows 2000 Server將一個綜合的PKI引入到windows平臺,作為其安全機制,并且提供了一整套服務和管理工具,以創(chuàng)建、部署和管理基于PKI的應用系統(tǒng)。Windows 2000Server PKI在提供高強度安全性的同時,還與操作系統(tǒng)緊密集成,并作為操作系統(tǒng)的一項基本服務而存在,避免了購買第3方PKI所帶來的額外開銷,同時也保證了系統(tǒng)兼容性。
本系統(tǒng)采用Windows 2000 Sewcr PKI作為一個內部CA服務器頒布證書和撤銷證書。
3、獲取證書中的信息
(1)Wcb Scrvices Enhanccmcnts for.NET
盡管.NET Framework中有System. Security. Cryptogj'aphy.X509Ccrtes命名空間,但它并不包括任何證書存儲類,受到的限制很多.Web Scnriccs Enhancemcnts for .NET(WSE)是一個新的.NET類庫,這個類庫實現(xiàn)了量新的Web服務協(xié)議。使用WSE可以從Windows客戶端的證書存儲單元中檢索證書,從證書中獲取密鑰,用它來執(zhí)行XML加密。
WSE可以從bttp://msdn.microsoft.com/websewiccs/webser-vices/building/wse/下載。
(2)系統(tǒng)存儲區(qū)和證書存儲單元
Windows客戶端上的系統(tǒng)存儲區(qū)描述了可從中進行證書存儲的上下文。
WSE支持的每個系統(tǒng)存儲區(qū)至少有4個預定義的證書存儲單元:
①My包含個人證書和對個人密鑰的引用;
②CA包含根證書和最終實體證書之間的證書;
③Trust包含可信的第3方的證書;
④Root包含根證書,必須使該存儲單元安全,因為它提供了證書鏈中最重要的部分。
(3)獲取證書
我們可以通過獲取證書存儲單元中的證書,生成密鑰。
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加密的編程實現(xiàn)
微軟公司在其.NET平臺中對XML加密提供了支持??梢允褂?NET Framework的System.Xml命名空間中的類和Sys-tem.Security.Cryptograpby命名空間中的類對XML文檔進行加密.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算法對XML文檔進行加密和解密。
(5)RSACryptoScrviceProvider類.System.Security.Cryptogra-phy命名空間中定義的RSACrypcoScrviceProvider類使用RSA算法對TripleDES算法產生的對稱密鑰進行加密和解密。
(6)Convert類.進行加密操作時,通常處理以字節(jié)數(shù)組形式存在的數(shù)據,在處理XML數(shù)據時,總是處理以文本串形式式存在的數(shù)據。在處理XML數(shù)據時,總是處理以文本串形式存在的數(shù)據。為解決這個差異,就必須在這兩種數(shù)據類型之間進行轉換.Con\rcrt類提供了轉換方法。
我們編寫的sender.cs和receIvcr.cs程序實現(xiàn)了發(fā)送方加密XML文檔并向接收方發(fā)送加密結果的典型情況。
接收方的EstablishXmIRsaParametcrs方法獲取Windows客戶端的證書信息,建立RSA非對稱密鑰對并存放在兩個文件中。RsalncludcPriVatcParams.xml文件含有公鑰和私鑰信息,這個XML文件絕對不能泄露,必須保證非授權用戶無法訪問這個XML文件.RsaExcludePrivateParams.xml只含有公鑰信息。
rccciver. EstablishXmIRsaParamctcrs(”RsalncludePrivate-Params.xml“,“RsaExcludePrivateParams.xml");
發(fā)送方的CreateAndEnayptXmIScssionKcy方法建立用于XML加密的TripleDES對稱會話密鑰,使用RsaExcludcPriVate-Params.xml中的公鑰,對該對稱密鑰加密,結果存放在文件SessionKeyExchangc,xml中。
byte[]IVpsender.CreateAndEncryptXmISessionKcy(—RsaEx-cludePrMrteParams.xml“,一SessionKeyExcbange.xml");
發(fā)送方的EncryptOriginalXmIDocumcnt方法用存放在文件SessionKcyExcbange.xml中的對稱密鑰對XMl文檔(Ori81-MI.Xml)加密,結果存盤(Encrypted.xml).scndcr.EncryptOriginaIXmIDocumcnt COriginal.xml”,’‘Ses-sionKcyExcbange.xml¨,一Encrypted.xml");
接收方的DecyptXmjDocumcut方法用存放在文件Scs-sionKcyExchange.xml中的對稱密鑰和文件RsalncludePrivate-Params.xml中的公鑰和私鑰對加密的XML文檔(Encrypted.xml)解密,結果存盤(Dccrypted.xml)。
rcccivcr. DccryptXmIDocument(‘Encrypted.xml",’Rsalnclu-dePrivateParams.xmI",NSessionKeyExcbange.xml_,“Decryp-ted.xmI",IV);
5、結合合XML加密和XML數(shù)字簽名
將XML加密和XML數(shù)字簽名這兩種操作結合在一起是可行的,如果加密和簽名同一個XML文檔,這兩種操作的順序就非常重要。應用程序必須區(qū)分加密操作在簽名操作前還是在簽名操作后完成。如果在簽名前執(zhí)行加密操作,就必須在驗證簽名后執(zhí)行解密操作,這是因為如果先解密,未加密的簽名會出現(xiàn)錯誤,這樣就無法進行驗證簽名的操作,相反,如果在簽名后執(zhí)行加密操作,就必須在驗證簽名前解密文擋。
小知識之XML
XML,是一種標記語言。標記指計算機所能理解的信息符號,通過此種標記,計算機之間可以處理包含各種信息的文章等。如何定義這些標記,既可以選擇國際通用的標記語言,比如HTML,也可以使用像XML這樣由相關人士自由決定的標記語言,這就是語言的可擴展性。XML是從標準通用標記語言(SGML)中簡化修改出來的。它主要用到的有可擴展標記語言、可擴展樣式語言(XSL)、XBRL和XPath等。





