针对电子政务中对电子公文保密的需求,特别是XML在电子商务和电子政务等领域有广泛的应用,为此我们今天就来谈谈基于XML格式的电子公文是如何实现XML加密的。
一、XML加密规范
要了解XML加密规范的所有信息,可以在http://www.w3.org/TR/xmlenc-core站点上查阅(XML Encryption Syntax andProccssing)。
XML加密语法使用元素表示加密,其基本结构如下:
在该基本结构中,“?”表示O次或1次出现,“+”表示1次或多次出现,“*”表示0次或多次出现。
(1)EncryptedData元素是密封(包含或引用)加密数据和解密所需相关信息(如私钥信息和所使用的加密算法)的最外层元素。如果该元素是XML文档的根元素,则整个文档都被加密。单个XML文档可能同时含有多个EncryptedData元素,但其中任一个EncryptedData元素都不能是另一个EncryptedData元素的父元素或子元素。
(2)EncryptionMethod元素是EncryptedData元素的子元素,使用XML加密规范中定义的算法标识符描述了所采用的加密算法,如果没有提供这个元素,那么参与XML加密的应用程序一定以某种方式共享或者隐含知道所使用的加密算法。
(3)ds:Keylnfo元素是EnctypkdData元素的子元素,该元素提供用于加密和解密数据的对称密钥,如果没有提供这个元素,那么参与XML加密的应用程序一定以某种方式共享或者隐含知道所使用的密钥。
(4)EncryptedKey元素是ds:Keylnfo元素的子元素,该元素用于交换对称密钥。
(5)AgreementMcthod元素是ds: Kcylnfo元素的子元素,该元素用于建立一个应用程序定义的、共享密钥的方法。如果缺少这个元素,应用程序必须以某种方式来处理密钥交换协议。
(6)ds: KeyNamc元素是ds: Kcylnfo元素的子元素,可以选择使用该元素来访问具有易懂名字的密钥。
(7)ds:RctricvaIKcy元素是ds:Kcylnfo元素的子元素,该元素提供到另一个含有密钥的EncryptedKey元素的URI链接。
(8)CipherData元素是EncryptedData元素的必要子元素,该元素包含或引用实际的加密数据。如果这个元素包含加密的数据,就会使用一个CipherValue子元素l如果这个元素引用加密的数据,就会使用一个CipherRcfercncc子元素。
(9)CiphcrValuc元素密封了实际的加密数据。
(1O)CipherReferencc元素密封了对外部加密数据的引用。
(11)EncrypoonPropertcs元素提供了应用程序专用的附加信息。
XML加密组合使用了对称密码和非对称密码算法。对称密码算法用于XML数据的批量加密,非对称密码算法则用于安全地交换对称密钥。加密和解密的基本工作原理如下:
(1)接收方生成一个非对称密钥对,其中一个用作公钥,另一个用作私钥;
(2)发送方可以通过非安全的方式获取接收方的公钥,如果需要验证公钥,发送方还可以通过认证机构获取接收方的公钥;
(3)发送方生成一个秘密的对称密钥;
(4)发送方用这个对称密钥加密XML文档中的预定元素;
(5)发送方使用接收方的公钥加密这个对称密钥;
(6)发送方将加密的数据、加密的对称密钥以及可选信息结合在一起,生成一个新的加密的XML文档;
(7)发送方将加密的XML文档发送给接收方;
(8)接收方析取出加密的数据、加密的对称密钥和可能需要的任何附加可选信息;
(9)接收方使用正确的非对称密码算法和自己保管的私钥来解密对称密钥;
(10)接收方使用解密的对称密钥来解密XML文档中被加密的元素。
二、XML加密在电子公文中的应用
1、系统结构
本系统采用B/S构架,客户端使用Web应用程序访问Web服务器,通过Web服务器访问CA服务器或数据库服务器。Web服务器提供文档中转、发布和访问CA服务器与数据库服务器;CA服务器提供安全注册、颁发证书和撤销证书。数据库服务器存储各种格式的数据,如数据库、XML文档等。用户通过客户端向CA服务器进行注册获取自己的证书,或者通过CA服务器查询其他客户的证书或撤销列表来获取他们的证书。发送方从接收方的证书获取他的公钥,对生成的XML文档加密后,通过Web服务器提交到数据库服务器分类存储;接收方通过Web服务器查询到相应的XML文档,用自己证书的私钥,对已加密的XML文档进行验证。
2、CA服务器
一般说来,实现CA服务器有3种方案。第1种是以用户为中心的管理,每个用户自己产生密钥对、签发公钥证书、维护信任链。这种方式对较小的应用系统或者对安全性要求不高的情况来说是有效的,比如PGP就是用这种方式,第2种方案是采用商业网站的CA服务,这是目前量为广泛使用的方式。比较有名的商业CA公司有美国的VeriSign,GTE Cybcr-Trust,中国金融认证中心FCA等。第3种方案是建立专用的公钥基础设施PKI,实现公钥管理的自动化。可采用商用PKI系统如eTrust PKI,或者使用开放源码PKI项目。
微软Windows 2000 Server将一个综合的PKI引入到windows平台,作为其安全机制,并且提供了一整套服务和管理工具,以创建、部署和管理基于PKI的应用系统。Windows 2000Server PKI在提供高强度安全性的同时,还与操作系统紧密集成,并作为操作系统的一项基本服务而存在,避免了购买第3方PKI所带来的额外开销,同时也保证了系统兼容性。
本系统采用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类库,这个类库实现了量新的Web服务协议。使用WSE可以从Windows客户端的证书存储单元中检索证书,从证书中获取密钥,用它来执行XML加密。
WSE可以从bttp://msdn.microsoft.com/websewiccs/webser-vices/building/wse/下载。
(2)系统存储区和证书存储单元
Windows客户端上的系统存储区描述了可从中进行证书存储的上下文。
WSE支持的每个系统存储区至少有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加密的编程实现
微软公司在其.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类.进行加密操作时,通常处理以字节数组形式存在的数据,在处理XML数据时,总是处理以文本串形式式存在的数据。在处理XML数据时,总是处理以文本串形式存在的数据。为解决这个差异,就必须在这两种数据类型之间进行转换.Con\rcrt类提供了转换方法。
我们编写的sender.cs和receIvcr.cs程序实现了发送方加密XML文档并向接收方发送加密结果的典型情况。
接收方的EstablishXmIRsaParametcrs方法获取Windows客户端的证书信息,建立RSA非对称密钥对并存放在两个文件中。RsalncludcPriVatcParams.xml文件含有公钥和私钥信息,这个XML文件绝对不能泄露,必须保证非授权用户无法访问这个XML文件.RsaExcludePrivateParams.xml只含有公钥信息。
rccciver. EstablishXmIRsaParamctcrs(”RsalncludePrivate-Params.xml“,“RsaExcludePrivateParams.xml");
发送方的CreateAndEnayptXmIScssionKcy方法建立用于XML加密的TripleDES对称会话密钥,使用RsaExcludcPriVate-Params.xml中的公钥,对该对称密钥加密,结果存放在文件SessionKeyExchangc,xml中。
byte[]IVpsender.CreateAndEncryptXmISessionKcy(—RsaEx-cludePrMrteParams.xml“,一SessionKeyExcbange.xml");
发送方的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数字签名
将XML加密和XML数字签名这两种操作结合在一起是可行的,如果加密和签名同一个XML文档,这两种操作的顺序就非常重要。应用程序必须区分加密操作在签名操作前还是在签名操作后完成。如果在签名前执行加密操作,就必须在验证签名后执行解密操作,这是因为如果先解密,未加密的签名会出现错误,这样就无法进行验证签名的操作,相反,如果在签名后执行加密操作,就必须在验证签名前解密文挡。
小知识之XML
XML,是一种标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用像XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。