首页 安全基础 网络安全 安全协议 病毒分析 防火墙 OS安全 无线安全 Web安全 PKI与PMI 入侵检测 经典案例
安全审计 设备安全 安全管理 安全标准 法律法规 隔离网闸 DB安全 XML安全 开源项目 资源下载 安全论坛 备份恢复
 当前位置:首页>>xml安全>>xml安全>>正文
xml 安全组件:增强电子商务的安全性
文章出处:   发布时间:2005-01-03   点击:0
 

    随着越来越多的公司在通过网络传输结构化数据时采用 xml,文档的安全性变得愈加重要。这篇文章介绍有关网络安全的基本知识,对 xml 安全组件的组成进行说明,并且通过一些示例说明 xml 安全组件中的技术如何增强网络商务的安全性。

  网络安全概述
  随着越来越多的公司在通过网络传输结构化数据时采用 xml,文档的安全性变得愈加重要。世界互联网联盟 (w3c) 和因特网工程任务组 (ietf) 正在制定用于数字签名的 xml 词汇表。东京研究实验室则已开发出 xml 安全组件,该安全组件是 xml 签名规范的原型。xml 安全组件可以从 ibm 的 alphaworks 获得,包括自动生成 xml 数字签名的工具。

  在通过网络传输保密数据时,应保证以下四点:
  1.机密性—其他任何人都不能访问或复制该数据。 
  2.完整性—该数据从发送者到达接收者的过程中未被更改。 
  3.身份验证—该文档确实发自所指的发送者。 
  4.无争议—发送者不可否认该文档确由其发送,也不能否认文档的内容。
  ssl 能够提供前三项功能,而 xml 安全组件则能同时提供上述四项功能

    创建安全会话
  创建安全会话包含多个步骤: 
  1.安全服务器获得适当的安全认证(ca)。 
  2.安全服务器将其公钥发送至客户端。 
  3.客户端使用服务器的公钥产生预置密码(由客户端生成的一个随机数,但比一般的随机数要复杂得多)。服务器利用私钥对预置密码解密。 
    4.服务器在预置密码的基础上生成新的密码。服务器知道该密码,且只能被产生该预置密码的客户端解密与使用。
  此过程将创建一个会话,其在特定客户端与服务器间的所有的数据交换均被加密。只有服务器和特定客户端能够相互进行数据解密。这样,机密性、完整性和身份验证均已包括。然而,ssl 不能实现无争议性,如果我的系统中有一个文 件,你可以否认曾发送过这个文件,或者可以否认文件内现有内容是你所发送的。无争议性是由 xml 安全组件所提供的一项功能。
  

  xml 安全组件
  xml 安全组件提供多项重要功能: 
  ◇xml 签名。此项功能的实现基于世界互联网联盟 (w3c) 和 因特网工程任务组 (ietf) 正在开发的 xml 签名核心语法和处理规范。(参见资源。) 
  ◇w3c 规范 xml 的工作草案的实现。(参见资源。) 
  ◇元素级加密。
  以下各部分将分别讨论上述功能及其如何增强网络安全。

  xml 签名
  w3c 和 ietf 正共同致力于一项基于 xml 的数字签名的计划。该计划定义一个 <signature> 元素,其中包含处理数字签名所需的全部信息。 每个数字签名均可归结为以下三类之一:
  ◇一个包含在<signature>元素中的 xml 元素 
  ◇一个由 uri 索引的外部 xml 文档 
  ◇一个由 uri 索引得外部非 xml 资源
  本文例子将向您展示如何创建这些资源。如果您想了解全部细节,请参见 xml 签名方案的最新草案(参见资源。) 

彩色代码
这篇文章的特点是彩色代码清单,这是我们在 dw 进行的一项新尝试。为产生彩色编码清单,使用了两种开放源码的工具。首先,使用 emacs 加载文件 (java、html、xml、以及其他任何文件)。emacs 对关键字、注解、函数名和其它十来种编程语言结构分别定义颜色。使用 emacs 加载文件并对文件着色后,使用了 htmlize 软件包,一个使用曾经流行一时的 emacs lisp 语言编写的开放源码的工具。htmlize 将 emacs 中显示的清单原样照搬,再将其转换为 html。最终得到一个完全彩色代码的文件,以突出其中的关键字、注释、函数名等。

我们非常希望了解您对这些经过改进的新代码清单的看法。

如果您想亲自进行这一操作,参见资源,其中包含了相关的链接。

   ◇xml 安全控件 
   将 xss4j.jar 和 /xss4j/samples 添加至您的classpath中。
   ◇java 2 development kit 1.2 版或更高版本。 
   请确认这是您的系统默认的 jdk。
   ◇javamail 包中的 mail.jar 文件 
   将此文件添加至classpath。
   ◇java 密码扩展系统的一个实现 
   在 sun 的网站中可以找到密码服务提供者的目录。为避免输出过于复杂,这里的例子采用了 openjce,一个免费的开放源码的库。将 jce.zip 添加至classpath中。
  ◇ibm xml 语法分析器第 2 版和 java 3.0.1 版 
  文件 xml4j.jar 必须位于classpath中。

  创建证书
  在生成数字签名前,首先要获得一份证书。尽管可以通过证书授权机构(ca)得到一份证书,但是在这里的例子中,你将充当自己的 ca。要创建在 signature.xml 中使用的 x.509 认证,可用 java 2 的 keytool 命令: 
  清单 1、keytool命令 

keytool -genkey -dname "cn=doug tidwell, ou=developerworks, o=ibm, 
l=research triangle park, s=north carolina, c=us" -keypass openstds 
-storepass security -alias xss4j

  在 keytool 命令中,特异名(dname)由普通名(cn)、组织单元(ou)、组织(o)、区域 (l)、州(s)和国家(c)组成。对于整个因特网,特异名被设计为唯一的。密匙库 (-storepass) 的密码为 security,此证书的私钥的密码 (-keypass) 为 openstds,而 xss4j 则是认证 (-alias) 的别名。

  对内部 xml 资源签名
  要创建数字签名,可以使用 samplesign 应用程序。这个程序是 xml 安全组件附带的,可以在 xss4j/samples 目录中找到。我们的第一个签名将应用于内部 xml 资源。也就是说数字签名和 xml 资源都在同一文件中。下面说明如何对 sonnet.xml 进行签名, 以生成 signature.xml:

  清单 2、samplesign应用 

java samplesign xss4j security openstds -embxml 
file:///d:/xss4j/samples/sonnet.xml > signature.xml

  (随便说一句,此命令为单行输入。)
  请注意,别名、私钥密码、密匙库密码同清单 1 的 keytool 命令是相同的。另外还应注意这里用 file: url 代替了简单 的文件名,而输出内容则送至(用 >操作符)文件 signature.xml。这条命令的执行结果是 signature.xml 中显示的文档。
  

  对外部 xml 资源签名
  对外部 xml 资源签名表明 <signature> 文件包含 xml 资源的 url,而不是资源本身。要创建这种数字签名,应使用 -extxml 选项: 
  清单 3、带有 -extxml 选项的 samplesign 应用 

java samplesign xss4j security openstds -extxml 
file:///d:/xss4j/samples/sonnet.xml > external-signature.xml

  这将产生一个同 signature.xml 相似的文件,只是实际的 xml 文件未被包含在 <signature> 中。

  对非 xml 资源签名
  最后的这个签名示例将为非 xml 资源生成一个数字签名。在这个例子中用到一个 gif 文件,包含 developerworks 的标识: 
  
  要创建数字签名,使用 -ext 选项:
  清单 4、带有 -ext 选项的 samplesign 应用 

java samplesign xss4j security openstds -ext 
file:///d:/xss4j/samples/dwlogo.gif > external-gif-signature.xml

  

  验证数字签名
  xml 安全组件提供了一个实用程序 sampleverify,用于验证数字签名。使用它, 可以检查给定的签名,以确认被签名的资源没有改变,此外还能检查该签名是否同发送者的证书信息相符。如果签名有效,清单 5 会显示出应当得到的结果:
  清单 5、sampleverify 应用 

java sampleverify -dom < external-signature.xml

signer: cn=doug tidwell, ou=developerworks, o=ibm, l=research triangle 
park, st=north carolina, c=us
signedinfo bytes: 1069
----------------------------------------
--> location: file:///d:/xss4j/samples/sonnet.xml
validity: ok
--> signedinfo: ok
--> all: ok 
----------------------------------------

  如果签名的文件被改动,该签名将不再有效。为了说明这种情况,可在 <line> 元素后面加一个空格,把 <line>my mistress' eyes are nothing like the sun,</line> 改成 <line>my mistress' eyes are nothing like the sun, </line>。 
  当再次检查签名,其结果将如清单 6 所示: 
  清单 6、sampleverify 应用(改过的文件) 

java sampleverify -dom < external-signature.xml

signer: cn=doug tidwell, ou=developerworks, o=ibm, l=research triangle 
park, st=north carolina, c=us
signedinfo bytes: 1069
----------------------------------------
--> location: file:///d:/xss4j/samples/sonnet.xml
validity: ng
reason: digests were mismatched.
--> signedinfo: ok
--> all: ng
---------------------------------------- 

  由于改动过的 xml 文件同数字签名不符,这样就可以知道不能信任该文件。(如果原始文件签署者以外的其他人试图冒充该数字签名的创建者,在 signedinfo 信息中便会显示出来。)

  无争议性的乐趣
  数字签名的最有用之处是能提供无争议性。如果你传送给我一份签署的文件,我能知道你就是发送者,因为签名中包括了你的公钥。另外,由于签名是基于文件内容的,所以对文件的任何改变都会使签名不符。

  规范的xml 规范形式

事物最简单的形式(韦氏学院字典,在线版) 

  为计算数字签名,需要一个通用的方法来表示所有的 xml 文件。可以采用 w3c 的规范 xml 标准来进行。
  

  清单 7、等价但不相同的 xml 

<img src="dwlogo.gif" width="225" height="30"/>
<img src="dwlogo.gif" height="30" width="225"/>

  如果对这两个元素进行简单的字符串比较,它们显然是不同的。然而,从 xml 处理的角度来看,它们是等价的。按照 xml 1.0 推荐标准,属性的顺序是不重要的。在 xml 源码文件中,其它非重要差异还包括属性间的空格数量 以及源文件中是否实际包含带默认值的属性。为解决这一问题,w3c 正在为 xml文档定义一个规范形式。

  xml 安全组件提供了一个应用程序 — xml canonicalizer (xml 规范器),这是对 w3c 将要出台的规范 xml 标准的原型的一个实现。要将 xml 文件转换为规范形式,可以用下面两个命令之一:

  清单 8、xml 规范器 

java c14ndom < sonnet.xml > canonical-sonnet-dom.xml
java c14nsax < sonnet.xml > canonical-sonnet-sax.xml

  c14ndom 应用程序使用 dom 语法分析器,而 c14nsax 应用程序则使用 sax 语法分析器。虽然可以使用这些应用程序来生成 xml 文件的规范形式,但是它们仍主要用于 xml 签名代码。(随便说一句,c14n 缩写是指 canonicalization 的拼写以字母 c 开始,以字母 n 结束,中间有 14 个字母。类似地,您也会经常看到 internationalization 被写成 i18n)。 
  因为 xml 签名代码使用规范形式产生数字签名,所以可以对原始文件进行适当改动而不影响数字签名的有效性。例如,在标记中添加一些空格。将下行: 

<sonnet type="shakespearean">

  更改为

<sonnet 
type="shakespearean">

  进行这一更改后,再次运行 sampleverify 应用程序,以确认数字签名仍然有效:
  清单 9、sampleverify 应用程序 (文件的规范形式) 

java sampleverify -dom < external-signature.xml
signer: cn=doug tidwell, ou=developerworks, o=ibm, l=research triangle 
park, st=north carolina, c=us
signedinfo bytes: 1069
----------------------------------------
--> location: file:///d:/xss4j/samples/sonnet.xml
validity: ok
--> signedinfo: ok
--> all: ok
----------------------------------------

  尽管文件不同,然而其差异没有语义重要性。因为 xml 安全组件使用 xml 文件的规范形式,语义上不重要的差异被忽略。
  元素级加密
  xml 的一个长处在于可以选择元素名,从而使标记文件更具可读性。作为一个例子,参见清单 10 中用xml 编写的客户订单。(也可以下载该文件)。 
  清单 10、 custorder.xml 

<?xml version="1.0"?>
<!doctype customer_order system "custord.dtd">
<customer_order>
<items>
<item>
<name>turnip twaddler</name>
<qty>3</qty>
<price>9.95</price>
</item>
<item>
<name>snipe curdler</name>
<qty>1</qty>
<price>19.95</price>
</item>
</items>
<customer>
<name>doug tidwell</name>
<street>1234 main street</street>
<city state="nc">raleigh</city>
<zip>11111</zip>
</customer>
<credit_payment>
<card_issuer>american express</card_issuer>
<card_number>1234 567890 12345</card_number>
<expiration_date month="10" year="2004"/>
</credit_payment>
</customer_order>

  这个文件包括三部分,<items> 元素列出顾客定购的各项内容,<customer> 元素包含了客户的信息,而 <credit_payment> 部分描述了用于支付该订单的的信用卡信息。(致初级网络窃贼:实际上,上面的信息不是我的信用卡号码。如果你能利用此信息购买商品和服务,请不要忘了跟我说一声。)

  早期的因特网用户不愿意使用信用卡进行在线购物。这时,许多电子商务支持者指出无论如何信用卡支付总是要冒一定风险的。通常我把信用卡交给饭店的服务员,我相信我的信用卡不会被用来支付我的餐费以外的其它东西。同样,当我在线购买时,我相信商家不会用我的信用卡支付未经我认可的款项。

  利用 xml 安全组件的元素级加密功能,可以对敏感信息进行加密。这样,商家也不能看见这些信息。商家可以把加密信息传给信用卡处理机构,这些机构拥有正确的密匙,可对敏感信息解密。这样将能极大地提高现行的典型处理方式的安全性。 

  为了说明元素级加密,我对 xml 安全组件所带的 ciphertest.java 文件稍做更改。(参见被修改文件的源文件。) 我将对所做的更改进行说明,以对元素级加密的工作原理进行解释。

  对 ciphertest.java 的第一项改变是导入 openjce 库,然后将 abaprovider 类定义为密码提供者: 

  清单 11、ciphertest.java 更改 (导入 openjce 类) 

import au.net.aba.crypto.*;
import au.net.aba.crypto.provider.*;
import au.net.aba.crypto.spec.*;
...

public class ciphertest {

public static void main(string[] args) {
if (args.length < 3) {
system.err.println("usage: ciphertest -e|-d passphrase infile outfile");
return;
}

java.security.security.
addprovider(new au.net.aba.crypto.provider.abaprovider());

  替代调用 java.security.security.addprovider 方法,可以修改 java.security 文件 (见 javahome/lib/security),将下面一行:

"security.provider.1=sun.security.provider.sun"

  替换为:

"security.provider.1=au.net.aba.crypto.provider.abaprovider"

  其它更改只剩下修改代码,使之能够对任何 <credit_payment> 元素进行加密: 
  清单 12、 ciphertest.java 更改 (加密元素) 

if (n.getnodetype() == node.element_node) {
//system.out.println(((element)n).gettagname());
if ((ne != null && 
((element)n).gettagname().equals("credit_payment"))
|| 
(nd != null && 
((element)n).gettagname().equals("encryptedelement"))) {
child = n;
break;

  要演示这一功能,可以运行 ciphertest,同原始的 xml 文件进行对比。应用程序 ciphertest 在命令行中使用了一个密码:
  清单 13、 ciphertest 应用程序 

java ciphertest -e security custorder.xml encrypted-custorder.xml

  这将创建 encrypted-custorder.xml 文件,如清单 14 所示。(也可以下载这个文件。)
  清单 14、 encrypted-custorder.xml <?xml version="1.0"?><customer_order>

<items>
<item>
<name>turnip twaddler</name>
<qty>3</qty>
<price>9.95</price>
</item>
<item>
<name>snipe curdler</name>
<qty>1</qty>
<price>19.95</price>
</item>
</items>
<customer>
<name>doug tidwell</name>
<street>1234 main street</street>
<city state="nc">raleigh</city>
<zip>11111</zip>
</customer>
<encryptedelement algorithm="des/cbc/pkcs5padding" contenttype="text/xml" 
encoding="base64" iv="s5rirg//pnq=">vjqnpdrqt1vmcvbygjfiwdidbyogxgmutgz6tvgopukvg7i
xnen50ikw8pmtxfixz5hochoxgttpqktqheho5+vlolafgiiodirqghhmhng3cld+8tvrt8wxpbcrsmupx4
d2tgxw2tqsepam0zxdmwuxwnsagar8hmiromd+bh+tdompv7efz4no5ft3jg3t0trllwvupf/5vaijimusm
uukkgyg8x9acs/kxjxhpmm=peqgzimf+8a=</encryptedelement>
</customer_order>

  在这个加密的 xml 文件中,元素 <credit_payment> 被替换为 <encryptedelement> 元素。文件中没有任何参数指示共对多少个元素进行加密、加密元素名称、加密元素的结构或顺序等。为保证加密文件的保密性,我们在源文件中没有使用 <!doctype 声明。加密文件不能使用 dtd,也不能包括任何可能显示加密元素结构的索引。如果对带有 <!doctype 声明的 xml 文件进行加密,解密过程不能工作。(得到的错误信息没有什么帮助;将显示 java.lang.nullpointerexception at ciphertest.main(ciphertest.java:83),或其它同样没用的提示信息。) 

  要恢复原始文件,使用 -d (decrypt/解密) 选项代替 -e (encrypt/加密) 选项。确认你用的密码是相同的。 

  清单 15、 ciphertest 应用程序 (-d 选项) 

java ciphertest -d security encrypted-custorder.xml restored-custorder.xml

  这会将加密文件恢复为原始状态。注意,元素级加密使用规范的 xml,所以恢复后的文件同原始文件的语法可能并不完全一样。然而,然而,这些差异在语义上都不是特别重要。

  其它工具
  xml 安全组件另外还提供了两种工具,包括一个 asn.1 到 xml 的翻译器和多种 domhash 工具。asn.1 到 xml 的翻译器自动在 asn.1 数据(如 x.509 认证和 ldap 数据)和 xml 间进行翻译。(有关 asn.1 的详细信息,参见资源)。domhash 是一种算法,为 xml 文件树中一个给定节点生成唯一的哈希数。xml 安全组件中所包括的 domhash 工具计算给定节点的哈希数,另外还提供了一套domhash 测试工具。alphaworks 包含一个 domhash 应用程序,叫做 xmltreediff(参见资源);它使用 domhash 来确定两个 dom 树的差异。 

  总结
  xml 安全组件提供了多项功能,以增强 xml 文件的安全性。所有这些技术都能为现有的网络安全体系所应用。随着 xml 文件交换日益重要,xml 安全组件中的技术将提供重要的安全功能。最重要的是,这些技术建立在开放的新兴标准下,而且能在任何支持 java 的平台上进行工作。如果你对这种即将被全世界所采用的安全技术感兴趣,xml 安全组件确实值得一看。
  

  资源 
  ◇在世界电信联盟网站里,可以找到 
  asn.1 基本标记规范和完整的 asn.1 标准集。
  ◇有关规范 xml 的细节,请参见由 w3c 提供的规范 xml 工作草案。
  ◇一本关于密码学的好书,applied cryptography (使用密码技术),作者 bruce schneier。《wired》 杂志评价该书时称“这是一本国家安全局永远不希望出版的书”,它包含所有你能想到的关于密码学的内容,甚至更多。
  ◇了解并下载 java 密码系统扩展,查看一个加密服务提供者目录。
  ◇从 sun、ibm 和其它网站,可以下载 java 2 development kit 1.2 版或更高版本。
  ◇了解并下载 javamail api 实现,这是一组模拟邮件系统的抽象类。
  ◇如果你对 java 安全性感兴趣,请参见 java 指南的 安全追踪。
  ◇了解并下载 open jce,一个免费的开放源码的 jce api 实现。
  ◇从 alphaworks 下载 ibm xml parser for java version 3.0.1 。
  ◇从 alphaworks 下载 xml security suite 。下载包中包括代码、文件以及本文讨论的全部程序实例。
  ◇参考 xml 签名工作组的主页,该工作组是 w3c 和 ietf 的合作伙伴。可以得到最新版本的 xml 签名设计方案。
  ◇使用来自 alphaworks 的 xmltreediff 来辨认 dom 树的差别,其中用到本文简要介绍过的 domhash 算法。
  ◇还可以找到由 itu 定义的 x.509 证书标准。从包括 verisign 在内的诸多认证机构均可获得 x.509 证书。
  ◇有关使用 emacs 将程序清单处理成彩色代码的信息,参见 http://www.gnu.org/software/emacs/emacs.html。htmlize 包则可以从 jagor.srce.hr 获得。



作者:
[返回顶部↑]  [推荐好友] [查看评论]  
用户名: 新注册) 密码: 匿名评论 [查看评论]  发表评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 
↑文章搜索
  关键字:  
  范  围:  
  开始搜索  
※相关文章※
 

◎xml-signature syntax and
◎exclusive xml canonicali
◎canonical xml
◎xml encryption syntax an
◎xkms 使安全性易于管理

 
※热点文章※
  ·xkms 使安全性易于管理
·xml encryption syntax an
·canonical xml
·exclusive xml canonicali
·xml-signature syntax and
·xml数据传输的安全加密第一
·启用 xml 安全性 
 

关于我们 | 征搞启示 | 版权信息 | 联系我们 | 友情链接

版权所有:中国信息安全组织 © 2003-2005 Power by DedeCms