给你的XML文件做个数字签名,防止文件被篡改

如今 XML已经非常普及了,越来越多的公司都在网上使用XML传输 结构化数据,特别是在电子商务中 XML应用尤其突出,比如在客户端用Web服务获取服务器端的office文件,修改后再回传给服务器。因此 XML文档的安全性也变得愈加重要,也越来越多地受到人们的关注。我们可以对 XML文件进行 数字签名,保证 XML文档的安全,以便确认原始文档没有被污染或变更。

XML数字签名的发展历史

  1999年,IBM 推出了XML安全组件,这是XML签名规范的原型, 它包含一些自动生成XML数字签名、实现   W3C   的“规范”XML工作草案,以及通过XML加密的实验性实现来提供元素级加密的实用程序;它还提供一种在应用到XML文档时处理安全性特定要求的方式,引入了“可扩展访问控制语言( XACL)”的XML模式定义。

  2001年,世界互联网联盟 (W3C) 和因特网工程任务组 (IETF) 共同组建的XMLSignature工作组,公布了XML数字签名的推荐版本──XML签名的语法和处理规范(缩写为XMLDSIG),作为数字签名的规范推出。自 2002 年 2 月以来,它一直是正式的 W3C 推荐规范,并得到了广泛的应用:微软.NET Framework 中的 System.Security.Cryptography.XML就应用了此规范。

  W3C将XML数字签名解释为:定义一种与XML语法兼容的数字签名语法描述规范,描述数字签名本身和签名的生成与验证过程。作为一个安全有效的数字签名方案,该规范提供了数字签名的完整性、签名确认性和不可抵赖性。为了适应不同的文件系统和剖析器,XML签名非常依赖“规范化”的概念,以便签名能够在XML文档所碰到的各种环境中起作用。在目前的规范中规定:消息摘要使用SHA—l算法,消息鉴别编码使用HMAC算法,数字签名使用DSA和PKCS1算法;在安全模式上,可以使用基于对称密钥和基于公开密钥两种体制。

[NextPage]

XML数字签名方式和示例

  XML签名可以用来确保XML文档内的内容没有发生改变,如果和XML加密联合使用,即可保证所接收的数据就是所发送的数据,外人无法阅读加密内容。XML数字签名有两种方式,即封装签名和分离签名,可以应用到任意数据内容。所谓封装(或被封装)签名,是指数据和签名在同一个XML文档中,而那些数据在签名元素外部的签名称为分离签名。下面是一个分离签名示例,XML文件经过数字签名之后,其内容如下所示:

  [s01]<Signature Id=MyFirstSignature

  xmlns=http://www.w3.org/2000/09/xmldsig#>

  [s02]<SignedInfo>

  [s03]<CanonicalizationMethod Algorithm=http://www.w3.org/TR/2001/

  REC-XML-c14n-20010315/>

  [s04]<SignatureMethod Algorithm=http://www.w3.org/2000/09/

  xmldsig#dsa-sha1/>

  [s05] <Reference URI=http://www.w3.org/TR/2000/REC-xhtml1-20000126/>

  [s06] <Transforms>

  [s07] <Transform Algorithm=http://www.w3.org/TR/2001/REC-XML-c14n-

  20010315/>

  [s08] </Transforms>

  [s09] <DigestMethod?Algorithm=http://www.w3.org/2000/09/

  xmldsig#sha1/>

  [s10] <Digestvalue>j6lwx3rvEPO0vKtMup4NbeVu8nk=</Digestvalue>

  [s11] </Reference>

  [s12]</SignedInfo>

  [s13]<Signaturevalue>MC0CFFrVLtRlk=...</Signaturevalue>

  [s14] <KeyInfo>

  [s15a] <Keyvalue>

  [s15b] <DSAKeyvalue>

  [s15c] <p>...</p><Q>...</Q><G>...</G><Y>...</Y>

  [s15d] </DSAKeyvalue>

  [s15e] </Keyvalue>

  [s16] </KeyInfo>

  [s17]</Signature>

  以上清单中 s02行和s12行之间是SignedInfo元素,即实际签名的信息。SignedInfo 的核心验证由两个必要过程组成:对 SignedInfo 的签名验证和 SignedInfo 内部每个 Reference 摘要的验证。

  s03行上, CanonicalizationMethod 标识了一种算法,这种算法被用来规范化 SignedInfo 元素,然后该元素作为签名操作的一部分被编摘。规范化(Canonicalization)是一种方法,过程使用该方法处理可包含在同一数据元素内部的不同数据流,例如,可以包含两种不同方法来表示文本。规范化是解释原始数据以使空格显示为空格而不显示为 ASCII 码的方法。

  s04行上,SignatureMethod引用的是将规范化的SignedInfo转换成Signaturevalue所用的算法。它是密钥相关的算法和摘要算法(在这里是DSA和SHA-1)的组合,为算法名签名以抵抗攻击,该攻击是基于替换成效率更低的算法。要提高应用程序的互操作性,候选方案指定一组需要实现的签名算法,虽然它们的使用任凭签名创建者处理。

  [s05-11] 每个 Reference 元素都包括摘要方法和对已标识数据对象计算得出的摘要值。它还可能包括产生对摘要操作的输入的转换。数据对象的签名是通过计算其摘要值并对该值的签名进行的。稍后通过引用和签名验证来检查该签名,这些验证将重新创建摘要值并确保它与该数据对象中的内容匹配。

  s05行上,Reference 的这个可选 URI 属性标识要签名的数据对象。在一个 Signature 中,至多可以对一个 Reference 省略该属性。(为了确保明确地匹配引用和对象,要强加这个限制。)

  [s05-08] 该标识与 transforms 一起是签名者提供的描述,其内容有关它们如何获得已编摘形式的已签名数据对象(即,已编摘的内容)。验证者还可能以另一种方法获得已编摘的内容,只要摘要验证这种方法。

  Transforms 是一种可选的处理步骤排序列表,在编摘资源内容之前,对它应用这些步骤。这是解密所需遵循的轨迹。Transforms 可以包括如规范化、编码/解码(包括压缩/扩张)、XSLT 和 XPath 等操作。XPath 转换有些复杂,因为它们允许签名者派生出省略一部分源文档的XML文档,并将XML树限制为它原来的那样。因此,未包含部分可以更改,而不影响签名有效性。 如果不存在 Transforms 元素,则直接编摘资源内容。应该记住,即使在候选方案中指定了基本缺省设置,还是允许用户指定的转换。

  [s09-10] DigestMethod 是在应用 Transforms(如果已经指定它)之后对数据应用以产生 DigestValue 的算法。DigestValue 的签名是将资源内容与签名者密钥绑定的机制。

  s13行上是SignatureValue 元素本身,它在 SignedInfo 之外,即位于签名部分之外,不过计算 SignatureValue 所使用的算法则包括在已签名的信息中。

  s14行和s16行之间是KeyInfo元素(该元素是可选的),它指出了用于验证签名的密钥。标识机制可以包括证书、密钥名称和密钥协议算法。KeyInfo 是可选的有两个原因。首先,签名者可能不希望向所有文档处理方披露任何密钥信息。为什么总要告诉人家?其次,该信息在应用程序上下文中可能是已知的,并且不需要明确表示。由于 KeyInfo 在 SignedInfo 之外,所以如果签名者希望将密钥信息与签名绑定,那么 Reference 可以容易地将 KeyInfo 作为签名的一部分标识并将其包括在内。

[NextPage]

给XML文件数字签名的方法

  你可以从 IBM 的 alphaWorks 获得IBM 的安全组件,该安全组件中有一个自动生成XML数字签名的工具,使用它即可给XML文件 签名。 此外,微软也发展了一套机遇数字证书的XMLsigned认证方式, 使用微软提供的 XMLsign.exe工具,也可以给XML文件数字签名 。

  一、 微软的数字签名法

  为了保护你的 XML文件,微软提供了office 2003 Developing resource/smart document developing software toolkit软件,该软件中有一个名为 XMLsign.exe 的 工具,你可以使用它对 XML文件数字签名,方法如下:

  1、准备工作

  首先下载安装微软的office 2003完整版,其大小有670MB,各大网站均有下载;然后下载安装office 2003 Developing resource/smart document developing software toolkit软件(下载地址 http://www.microsoft.com/downloads/details.aspx?familyid=24a557f7-eb06-4a2c-8f6c-2767b174126f&displaylang=en ),安装完成后,在X:\Program Files\Microsoft Office 2003 Developer Resources\Microsoft Office 2003 Smart Document SDK\Tools目录下就有一个XMLsign.exe文件,利用该文件即可对XML文件签名。

  2、创建自己的数字证书

  接下来,下载安装微软的 Authenticode for Internet Explorer 5.0(下载地址 http://www.microsoft.com/downloads/details.aspx?familyid=2b742795-d0f0-4a66-b27f-22a95fcd3425&displaylang=en ),该工具包中有个 makecert.exe程序,你可以用它来制作自己的数字证书,产生一个数字证书文件lacl.cer和对应的私匙文件lacl.pvk,操作步骤如下:

  将 XMLsign.exe和要签名文件 sonnet.XML,都 拷贝到 makecert.exe所在目录;然后在命令提示行中,用CD命令进入makecert.exe所在目录,输入以下命令

  makecert -sv lacl.pvk -n CN=lh1 lacl.cer

  3、生成软件发布spc证书

  由以上数字证书,生成一个spc证书(lacl.spc),操作步骤是:在命令提示行中,用CD命令进入makecert.exe所在目录,然后输入命令cert2spc lacl.cer lacl.spc即可。

  4、对XML文件进行数字签名

  用spc证书,对某个XML文件进行数字签名,操作步骤如下:先在Windows下进入目录,把要签名的XML文件(例如sonnet.XML)和XMLsign.exe,都拷贝到makecert.exe所在目录下;然后在命令提示行中,用CD命令进入makecert.exe所在目录,输入命令XMLsign sonnet.XML-spc lacl.spc -v lacl.pvk

[NextPage]

二、XML安全组件签名法

  IBM 的 X ML 安全组件,也可以对XML文件进行数字签名,方法如下:

  1 、准备工作

  下载安装 Java 2 Development Kit ,下载地址http://192.18.97.149/ECom/EComTicketServlet/BEGIN7266332AC4DA34792F559F9D93294C03/-2147483648/719182887/1/430034/429902/719182887/2ts+/westCoastFSEND/j2sdk-1.4.1_07-oth-JPR/j2sdk-1.4.1_07-oth-JPR:1/j2sdk-1_4_1_07-windows-i586.exe ,文件大小 37MB ;然后 下载安装之XMLSecurity Suite (http://www.alphaworks.ibm.com/tech/xmlsecuritysuite ) ,将 /xss4j/samples和xss4j.jar (http://pws.prserv.net/Hiroshi.Maruyama/xmlbook/samples4v2/chap3/xss4j.jar )添加至你的 classpath 中。

  2、创建自己的数字证书

  在对 XML文件数字签名之前,首先应该有一个X.509数字证书,你可以用 Java 2 的 keytool 命令创建这个数字证书,方法如下:进入命令提示符下,CD命令进入X:\Program Files\j2sdk1.4.1_07\bin目录,输入以下命令

  keytool -genkey -dname CN=lh1, OU=cwk, O=zlsgs,L=liuan, S=anhui, C=china -keypass 123456 -storepass security -alias xss4j

  在以上命令中, dname称为特异名,特异名在整个因特网上都是唯一的,dname由普通名(CN)、组织单元(OU)、组织(O)、区域 (L)、州(S)和国家(C)组成;密匙库 (-storepass) 的密码为 security,此证书的私钥密码 (-keypass)为123456,而 xss4j 则是认证 (-alias) 的别名。

  3、如何对内部XML资源数字签名

  下面我们要用刚才生成的数字证书,对 d:/xss4j/samples/sonnet.xml文件进行数字签名,首先我们看看如何对内部XML资源数字签名?如果你要以这种方式对sonnet.xml签名,签名过后,将会产生一个新文件lh.XML,该文件内容如下图1所示,包含了签名信息、密钥和原来sonnet.xml文件的内容(如下图1)。

图1

  要创建这样的数字签名,你可以使用 SampleSign 应用程序,这个程序是XML安全组件附带的,你可以在 xss4j/samples 目录中找到之。以下是对 sonnet.XML进行数字签名的方法:

  进入命令提示符下, CD命令进入X:\Program Files\j2sdk1.4.1_07\bin目录,输入以下命令(注意以下命令是单行的)

  java SampleSign xss4j security 123456 –embXMLfile:///d:/xss4j/samples/sonnet.XML> lh.XML

  请注意:上面命令中的别名( xss4j)、密匙库密码(security)、私钥密码(123456)、与以上keytool 命令中的相同,这里用 file: URL 代替了简单的文件名,而输出内容则送至(用 >操作符)文件 lh.xml中。执行过该命令之后,利用证书对内部XML资源数字签名就大功告成,结果会产生一个签名过的XML文件lh.XML。

  4、如何对外部XML资源数字签名

  对外部XML资源签名,表明文件中的<Signature>下包含XML资源的 URL,而不是资源本身,即分离的数字签名。要创建这样的数字签名,应使用 -extXML选项,方法如下:进入命令提示符下,CD命令进入X:\Program Files\j2sdk1.4.1_07\bin目录,输入以下命令

  java SampleSign xss4j security 123456 –extXMLfile:///d:/xss4j/samples/sonnet.XML> external-lh.XML

  于是将产生一个签名过的 XML文件external-lh.XML,它与以上的lh.XML相似,不过sonnet.xml文件的内容,并没有被复制到external-lh.xml中的<Signature>下。

  5、验证数字签名

  XML安全组件还提供了一个实用程序 SampleVerify,用来验证数字签名。使用它,你可以检查某个签名过的XML文件,以便确认被签名的资源没有被篡改,此外还能检查该签名与发送者的证书信息是否相符。

  例如要验证 external-lh.xml中的数字签名,你可以这样操作:进入命令提示符下,输入以下命令

  java SampleVerify -dom < external-lh.XML

  显示结果如下:

  Signer: CN=lh1, OU=cwk, O=zlsgs,L=liuan, S=anhui, C=china

  SignedInfo Bytes: 1069

  ----------------------------------------

  --> Location: file:///d:/xss4j/samples/sonnet.XML

  Validity: Ok

  --> SignedInfo: Ok

  --> All: Ok?

  从以上命令的显示结果可知,该数字 签名有效, 签名过的文件没有被改动。假如签名过的文件被改动了,以上命令执行后,将会显示不同的结果,表示该签名不再有效,于是改动过的XML文件同数字签名就不符,我们即可知道不能信任该文件。

 

 

 

xmlsign [options] filename
ArgumentDescription
filenameThe name of the manifest file to sign.
OptionDescription
-chDisplay information for all certificate chains used in the signature.
-cn nameSpecifies the common name of the certificate in the certificate store.
-gShow the standard certificate information dialog.
-GuiDisplays the user interface included with the original release of the Smart Document SDK.

Important  You cannot use this user interface to add a time stamp to the XML signature on the XML expansion pack manifest file.

-k  keyname Specifies the key container name.
-n levelSpecifies the level of information to display about the signing certificate.
  • 0 - Display the presence of the certificate only (default)
  • 1 - Display the friendly name for the certificate
  • 2 - Display the friendly name, simple name, and relative distinguished name (rdn name) for the certificate.
-pproviderSpecifies the name of the cryptographic provider on the system.
-s storeSpecifies the certificate store that contains the signing certificate. The default is my store.
-spc fileSpecifies the software publisher certificate (SPC) file that contains software publishing certificates.
-t URLIndicates that the file is to have a time stamp by the time-stamp server at the specified address (e.g. http://timestamp.verisign.com/scripts/timestamp.dll ).
-v pvkFileSpecifies the private key (.pvk) file name that contains the private key.
-yVerifies the signature in the specified file.
Remarks

To sign with a software publisher certificate (SPC) file, you must specify the -spc and -v options if your private key is in a .PVK file. If your private key is in a registry key container, you must specify the -spc and-k options.

Examples
  • The following command signs a manifest file using an SPC and a private key from the the registry key container.

    xmlsign -spc XYZ.spc -k XYZ manifestXYZ.xml

  • The following command signs the manifest file using a certificate andprivate key.

    xmlsign -spc manifestXYZ.spc -v manifestXYZ.pvk manifestXYZ.xml

  • The following command signs a manifest file using a nCipher certificate and a private key in a registry key container.

    xmlsign -c manifestXYZ.cer -k manifestXYZ -p "nCipher Enhanced Cryptographic Provider" manifestXYZ.xml

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值