探索XML加密 第2部分

 
   | |

导读:本文借助于一个用例方案研究了XML加密的使用模型。继续上一次的XML加密实现,并利用JCA/JCE类支持密码术。最后,简要讨论了XML加密在基于SOAP的Web服务中的应用。

关键词:XML加密 JCA/JCE SOAP Web服务

 
正在加载数据...

  在第二部分中,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服务中的应用。


XML安全
 Concordia和XML安全协同工作能力
 XML安全组件:增强电子商务的安全性
 XML安全:实现安全层 第1部分
 XML安全:实现安全层 第2部分
 启用XML安全性
 探索XML加密 第1部分
 探索XML加密 第2部分
 XML签名:幕后
 XML安全:XML密钥管理规范
 澄清SAML的不实说法和误解
 XML安全:使用SAML确保可移植的信任
 集中式策略管理简化SOA开发治理
 基于XML的元数据交换

原文出处:http://www.ibm.com/developerworks/cn/xml/x-encrypt2/index.html
 
来源:IBM    作者:Bilal Siddiqui     
 
 
 
 
 

XML与XML Schema

 
Web服务描述语言,或者缩写为WSDL,自2001年开始已经在流传了,当他的第一个版本被W3C发布,始终处于开发状态。
 
我们应该知道常常不是所有技术适应所有工作。但是我承认XML可能更接近“X”代表“可扩充的(eXtensible)”。毕竟这更像是一种为了适应……
 
XMI(基于XML的元数据交换)使用扩展标记语言(XML),为程序员和其它用户提供元数据信息交换的标准方法。XMI的目的在于帮助使用统一建模……
 
可扩展标记语言(XML,Extensible Markup Language)是一种创建公共信息格式并在万维网、内部网等网络中共享数据和格式的灵活方式。
 
可扩展商业报告语言(XBRL,Extensible Business Reporting Language)是一种专用于商业数据和财务数据电子传输的、基于可扩展标记语言(XML)的计算机语言。

热门技术手册排行

 

随着开源技术越来越成熟,一个稍有开发经验的人通过学习就可以用开源的产品和技术构建一套可用的系统。对于从事软件开发的人员,尤其是对Java或动态语言相关领域的人来说,“开源”也许是他们最喜爱的单词。但是,很多时候我们需要的不仅仅是一个可用的系统,而是希望这个系统开发更简易、性能更高和扩展性更好等。这确实是一个令人头痛的问题。本指南很多地方都是点到为止,要深入了解相关信息的读者请借助参考资料、网站等自行挖掘。

 

本专题分六部分探讨SOA设计模式,当初设计面向服务架构的一大初衷就是降低服务间耦合度,由此提高服务的灵活性和自由度。

 

业务流程管理(business process management,bpm)不是一个新概念,甚至不是一个新名词。它是从相关的业务流程变革领域,如业务流程改进(bpi)、业务流程重组(bpr)、业务流程革新中发展起来的。流程管理技术也是从早期的工作流管理、eai、流程自动化、流程集成、流程建模、流程优化等技术中发展起来的。

 

TOAGF是一个架构框架,简而言之,TOGAF是一种协助发展,验收,运行,使用,和维护架构的工具。它是基于一个迭代(Iterative)的过程模型,支持最佳实践和一套可重用的现有架构资产。

 

云计算的概念越来越流行,Amazon、Google和IBM是第一批将云计算引入公众视线的公司。云计算就是新的Web2.0,一种既有技术上的市场绽放。

 

Mashup是一个非常cool的新的应用程序种类。如果你想真正的了解它们,我们需要回过头来看看你现在的计算机,其实它就是一个非常好的帮助你理解mashup的模型。现在开源的操作系统无疑是非常好的apis的集合或应用程序编程接口,帮助开发者去构建其应用程序。计算机本身也是一个很好的为用户提供接口的例子,键盘和鼠标可以被理解为你通过计算机的接口而使用的不同的应用程序。本技术手册为读者提供了一些相关信息,如果需要深入了解mashup,读者可以借助其他参考资源。

查看更多
 
 

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
电子邮件地址:
请输入您的电子邮件地址
密码:
下次自动登录