探索XML加密 第2部分

日期: 2009-03-17 作者:Bilal Siddiqui 来源:TechTarget中国 英文

  在第二部分中,Bilal Siddiqui借助于一个用例方案研究了XML加密的使用模型。他展示了一个简单演示应用程序,解释了该应用程序如何使用XML加密实现。接着他继续上一次的XML加密实现,并利用JCA/JCE类支持密码术。最后,他简要讨论了XML加密在基于SOAP的Web服务中的应用。

  在本系列专栏文章的第1部分中,我介绍了XML加密(XML Encryption)及其基本语法和处理。我使用安全交换结构化数据的简单示例,研究了XML加密中的不同标记及其各自的用法,提出了基于DOM用于XML加密的Java API,并简要概述了Java中的密码术(JCA/JCE)。

  在这一部分中,我以一个信息交换方案开始我的讨论,该方案演示了XML加密的用法。

  信息交换方案

  请考虑两家企业间信息交换的过程。一家企业是在线图书销售商,另一家是出版社。图书销售商要采购图书时,向出版社提交采购订单。在出版社这一方,销售部门收到这份订单,对它进行处理,并将它转交给会计部门。这两家企业交换的是XML文档格式的信息。由于发送时一部分文档需要安全,而其余部分不需要安全,所以要将安全性应用于文档的不同部分,则XML加密是很自然的方法。

  依据图书销售商的安全性策略,支付信息只能让会计部门知道。销售部门只需抽取出书名、它的项标识以及订购数量;因为这些信息是它可以保留的无需安全的不敏感信息。会计部门要使用一个预先交换的秘钥对采购订单中的支付信息解密。(注:XML加密只关于加密和解密结构化信息,而不规定密钥交换的任何特定方法。)通过映射这个策略,XML加密提高了销售部门支付信息的隐密性,也帮助了会计部门对此信息的解密。

  基于文档的安全性

  此时,稍许认真考虑一下基于文档的安全性概念可能很有用。使用这个安全性体系结构,您可以将安全性强制在文档级别。安全会话的上下文在安全文档内受到很有效的保护。在该文档内可以获得被授权方因解密文档可能需要的所有信息。创建的合乎逻辑的安全会话很灵活、具有很长的寿命,而且它允许多方参与同一安全会话。即将发布的Web服务协议“业务事务协议(Business Transaction Protocol(BTP)”依赖的是相同的概念,即在事务文档内保存会话上下文;这延长了事务的寿命,并增强了它的灵活性。

  演示应用程序

  要满足上述出版社和图书销售商之间的安全数据交换方案,我创建了一个称为demoXmlEncApp的演示应用程序类(请参阅清单1)。该类使用XML加密样本实现类XmlEncryption(请参阅清单2)。

  演示应用程序做了什么

  在图书销售商一方,通过调用读取采购订单XML文件Order.xml(请参阅清单3)的simulateBookSellersEnd方法,demoXmlEncApp类的main方法首先执行处理,并通过XML加密中指定的三种加密方法(例如:整个XML文件加密、元素加密或元素内容加密)中的一种对该XML文件中的敏感信息加密。然后它将XML加密的文件以及用于加密的密钥保存到磁盘。

  清单3. Order.xml
<?xml version=”1.0″?>
<!– This Listing provides the sample XML File that will be encrypted. –>
<purchaseOrder>
 <Order>
  <BookName>Soccer For Dummies</BookName>
  <Id>123-958-74598</Id>
  <Quantity>500</Quantity>
 </Order>
 <Payment>
  <CardNo>4502-3456-3278-2011</CardNo>
  <CardType>VISA</CardType>
  <ValidDate>12-10-2004</ValidDate>
 </Payment>
</purchaseOrder>

  由于文件交换和密钥交换协议不是这里所涉及的内容,因此我假定出版商可以通过任何适当的方法使用这些协议(例如,分别通过HTTP和某些公钥加密算法交换XML加密的文件和秘钥)。main方法接着通过调用simulatePublishersEnd方法来担任出版商这一角色,抽取销售部门所需的信息,并在控制台上显示收到的XML文件。而且,它还向会计部门解密支付信息,并在控制台上显示。

  demoXmlEncApp类中的simulateBookSellersEnd函数首先实例化XmlEncryption对象,然后调用XmlEncryption的各种设置方法来设置如下属性:

  ·clearDoc:要加密的XML文件(请参阅清单3)的DOM对象形式
  ·encKey:用于加密的密钥
  ·algoName:加密算法名称
  ·keyName:加密密钥的名称;在如本专栏文章第1部分解释的XML加密期间,它是KeyName元素的子文本节点值
  ·encId:文档中赋予EncryptedData标记唯一的名称

  根据调用应用程序时所传递的命令行参数,demoXmlEncApp类的simulateBookSellersEnd方法调用XML加密引擎(XmlEncryption类)的不同方法。让我们看一下在XmlEncryption类内部发生了什么,它是主XML加密处理引擎。

  XML加密实现细节

  在第1部分中,我已经介绍了被提议的XML加密API的一部分内容。请回忆在类XmlEncryption(请参阅第1部分的清单11)中有一个用于对整个XML文件加密的名为encryptCompleteXmlFile的方法。除了encryptCompleteXmlFile方法,我现在添加了以下两个方法来为不同数据类型的加密要求(加密颗粒度)提供服务。

  ·encryptElementOfXmlFile,用于加密XML文件中的特定元素
  ·encryptElementContentOfXmlFile,用于加密XML文件中特定元素的内容

  通过使用XmlEncryption类的以下三种XML加密方法中的任何一种,图书销售商就可以保护采购订单中的敏感信息:

  ·加密整个XML文件
  ·加密XML文件中的元素
  ·加密XML文件中元素的内容

  1. 用XML加密对整个XML文件加密

  图书销售商可以对整个Order.xml文件加密,以产生XML加密的文件,这样就可以发送到出版社的销售部门。虽然这种方法在端对端通信链路中提供了适当的安全性,但违反了图书销售商的安全性策略。该策略要求不透露销售部门的支付信息而向会计部门提供该信息。在这种情况下,销售部门对整个XML文档解密,这就泄露了支付信息。因此这种方法看来不合适,虽然如果您使用 超级加密(本文稍后讨论)可能会有用。

  如果图书销售商决定对整个Order.xml文件加密,那么类demoXmlEncApp中的simulateBookSellersEnd函数就生成对类XmlEncryption的公用方法encryptCompleteXmlFile的调用。

  该方法首先调用getString私有方法将要加密的XML文件序列化成字符串形式。接着它调用加密方法getEncryptedData,返回用Base 64编码的密码文本字符串。接着该密码文本字符串传递给getCipherDataDoc私有方法。该方法创建并返回带有CipherValue子标记的CipherData标记,该标记含有用Base 64编码的密码文本字符串。类似地,创建EncryptionMethod和ds:KeyInfo标记。这三个标记―即CipherData(携带CipherValue子标记)、EncryptionMethod和ds:KeyInfo―是作为EncryptedData标记的子标记随后添加的。EncryptedData标记实际上被装入到DOM文档对象encDataObj中,该对象被序列化并返回给simulateBookSellersEnd方法。

  2. 用XML加密对XML文件中的元素加密

  图书销售商可以用会计部门的秘钥对XML文件的支付信息部分加密,而使文件内容其余部分保持不加密,以便销售部门查看。可以通过对Order.xml文件中的Payment元素加密来完成这个处理。信用卡信息也变得安全,因为它驻留在加密的Payment元素的子节点中。由于安全性要求规定必须对未授权的查看者保密支付方式(诸如信用卡或银行支票),对Payment元素加密就做到了这一点。

  在这种情况中,类demoXmlEncApp中的simulateBookSellersEnd函数生成对类XmlEncryption的公用方法encryptElementOfXmlFile的调用。私有方法getElement返回元素节点,随后对它序列化并加密以产生CipherData标记。EncryptedData标记的创建过程与前一种方法相同,只是这种方法通过调用私有方法replaceElement,将clearDoc中的Payment元素替代为EncryptedData元素。完成替代后,序列化clearDoc并返回。

  3. 用XML加密对XML文件中的元素内容加密

  图书销售商可以实行的第三种加密选择是只加密Order.xml中的信用卡号。调用元素内容加密方法,它只对CardNo元素的文本内容加密。这就提出了一个重要问题:使用元素加密就可以实现同样的内容加密,那为什么还要提出内容加密呢?使用哪种方法取决于文档的安全性策略;如果存在透露元素名称或其属性的特殊需要,而又要保持其内容安全时,内容加密就很方便。

  如果图书销售商只想保密信用卡号,就加密Order.xml中元素CardNo的文本内容。simulateBookSellersEnd方法调用公用方法encryptElementContentOfXmlFile,它与encryptElementOfXmlFile方法的不同之处仅仅在于,它对元素的内容操作,而不是元素本身。

  使用XML加密来解密XML加密的文件

  出版社一方接收XML加密的文件时,就要对该文件解密。对于所述的所有三种方法,解密的方法都是getDecryptedData。demoXmlEncApp中的simulateBookSellersEnd方法将XML加密的文件序列化成文本字符串,并将它传递给getDecryptedData方法进行解密。

  getDecryptedData方法标识EncryptedData标记,并抽取出用Base 64编码的密码值。XML加密标记中存在着解密需要的所有信息:加密算法的名称、加密的数据类型以及加密密钥的名称。

  注:XML加密规范没有规定XML加密标记内应该提供所有这些信息。这些属性的提供是可选的。应用程序可能通过某些其它方式提供这些信息,但演示应用程序和样本XML加密实现假定XML加密标记内提供了所有这些信息。

  getDecryptedData方法现在根据密钥和算法名称生成解密密钥。接着它将抽取出的用Base 64编码的密码值、解密密钥以及算法名称传递给名为Decrypt的方法(见密码术中的研究)。

  Decrypt方法将已译码和解密的数据作为文本字符串返回。依照EncryptionData元素的类型属性对该文本字符串操作,该类型属性可能是以下属性中的任意一个:

  ·整个XML文件,作为新的XML文件保存到磁盘
  ·元素,替代EncryptedData标记以产生原始XML文件
  ·元素内容,替代EncryptedData标记以产生原始XML文件

  超级加密

  使用超级加密时,您可以用会计部门的秘钥只加密支付信息,以产生元素加密的XML文件。接着,通过使用销售部门的秘钥对这个结果文件完成加密,这就产生了超级加密的XML文件。

  这里,我必须指出:使用XML加密规范可以对XML加密的文件再加密,这会产生超级加密的XML文件。但是,您不能使用XML加密对EncryptedData或EncryptedKey元素的特定子元素加密。换句话说,EncryptedData元素不能是另一个EncryptedData元素的父元素或子元素。

  依据XML加密规范,还可以对任意数据(例如,.jpg图像或Web上几乎任何内容)加密。这几乎等同于整个XML文件的加密;唯一区别是EncryptedData元素类型属性的值不同。

  密码术

  XML加密规范列出了许多必需的和可选的密码术算法,包括:

  ·块加密
  ·流加密
  ·密钥传送
  ·密钥协议
  ·对称密钥包
  ·消息摘要
  ·消息认证

  另外,Base 64编码算法也是必需的。在可以将每个密码插入到XML文档之前,它们都必须用Base 64编码。在这个演示中,我使用了SunJCE密码术供应商的TripleDES块加密算法。加密方式是块大小为8字节的CBC(Cipher Block Chaining,密码块链接)。

  XmlEncryption类使用由以下方法实现的JCA/JCE密码术:

  ·getEncryptedData:这个方法接受文本字符串,并使用TripleDES算法对它加密。对于对称加密,除了加密的明文数据以外,还需要加密密钥。这个密钥可以用作为类XmlEncryption的私有属性encKey。输入文本字符串转换成了字节数组,并用它填充。我对需要将明文数据字节放在8字节块的加密使用块密码算法,所以我用一些字符填充最后一个不完整的块。样本实现使用空格(””)作为填充字符。

  接着创建Cipher类对象,并以加密方式对它初始化。随后我将初始向量(IV)抽取到字节数组,对明文数据进行块加密,并将IV字节置于加密的数据字节之前。使用类XmlEncryption的方法getBase64Encoded时,结果字节数组转换成了用Base 64编码的字符串,随后被返回。

  ·Decrypt:这个方法与getEncryptedData方法根本相反。它接受用Base 64编码的密码字节数组,并对它译码和解密以返回明文数据字符串。接着将IV与真正的密码字节数组分离。这样就用解密方式创建并初始化了Cipher类对象。接着对该密码字节数组解密,解密的字节数组作为文本字符串返回。

  我已经对TripleDES块密码算法提供了支持,但只用于演示。作少量修改,您还可以使用诸如AES等其它算法。

  这个简单实现演示了XML加密如何能够成为用于较大型以及比较复杂业务应用程序的可行的安全性框架。

  XML加密和SOAP

  简单对象访问协议(Simple Object Access Protocol),或简称为SOAP是用于数据交换的轻量级的以XML为基础的协议。它促进了由远程过程调用和响应产生的数据传送。它设计成用于分布式和远程应用程序中,并且它是Web服务的主要组件。SOAP提供了包含消息及其处理信息的信封。由于这个信封内容很机密,所以安全性就是您必须解决的问题。XML加密对此问题提供了无缝的解决方案。

  SOAP本身是XML,它让您使用XML加密以任何合适的方式随意处理加密问题。例如,您可以决定对整个SOAP主体加密,也可以对部分主体加密。然而,XML-SEC是W3C的成果,它的目的在于使实现基于SOAP的Web服务中的安全性的方法标准化。目前,它不包含XML加密;我期望XML加密或类似的加密方法将来成为它的一部分。

  结束语

  在第1部分中,我介绍了XML加密,并讨论了它在实现安全的数据交换中的使用。我详细描述了不同的XML加密标记的使用,并提出了基于DOM的用于XML加密的Java API。

  在这个第2部分中,我研究了典型的数据交换方案,其中您可以使用XML加密概念。我还演示了各种类型的XML加密方法:加密整个XML文件、加密XML文件的元素或者加密XML元素的内容。我还讨论了解密、超级加密以及XML加密概念在基于SOAP的Web服务中的应用。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐