本文首先简要介绍技术背景,以实例来讲解 xml 数字签名的语法和处理规则,之后用具体的程序例子解释如何使用 java se 6 生成各种格式的 xml 数字签名并进行验证
xml 数字签名技术用于对 xml 格式的数据进行数字签名,以保证报文的完整性,不可否认性,以及提供身份认证信息。jsr 105 提供了 xml 数字签名的 java 接口,而最近发布的 java se 6 则包括了 jsr 105的 实现,从而为基于 java 的应用程序提供了标准的 xml 数字签名接口。本文首先简要介绍技术背景,以实例来讲解 xml 数字签名的语法和处理规则,之后用具体的程序例子解释如何使用 java se 6 生成各种格式的 xml 数字签名并进行验证。
1. 技术背景
1.1 数字签名简介
数字签名是非对称密钥技术的一种应用模式,用于保证报文的完整性,不可否认性,以及提供身份认证信息。数字签名的原理如图 1 所示。
图 1:数字签名的原理
发送者在发送报文之前,先选用某种摘要算法为报文生成一个摘要值,并使用自己的私钥对摘要值加密,然后将加密后的摘要附在报文后面,一同发送给报文的接收者。接收者收到报文后,从中分离出原始报文和加密后的报文摘要,使用与发送者相同的摘要算法计算原始报文的摘要值 d,并使用发送者的公共密钥将加密后的报文摘要解密得到摘要值 d’,检查 d 与 d’ 是否匹配。
如果匹配,那么由于密钥对的唯一性,所以可以确定报文发送者的身份,而且由于数据摘要算法的特点,还可以确定原始报文在传输过程中没有被篡改。
1.2 xml 数字签名简介
xml 发展至今,已经逐渐成为标准的数据描述技术,在分布式应用中广泛地用于数据的交换。由于 xml 数据本身的特殊性和使用 xml 进行数据传输的分布式应用的特点,在对 xml 文档的特定部分进行签名,多方签名,以及签名后保持 xml 文档原有的良构特性等诸多方面,传统的数字签名技术都无法很好地实现。
基于这样的问题,w3c 组织制订了 xml 数字签名规范,规定了标准的 xml 数字签名语法和处理规则。同传统意义的数字签名相比,xml 数字签名能够对 xml 文档进行细粒度地分析,支持多种方式的文档数据转换,只对文档的特定部分进行签名和验证,并且能够保持 xml 文档的良构特性。此外,xml 数字签名提供的密钥信息表示方法清晰易读,更加便于签名的自动验证处理。
1.3 xml 数字签名实例
本节用一个简单的例子来介绍 xml 数字签名的语法和处理规则。
表 1签名前的 xml 文档
|
1. <?xml version='1.0'?> 5. <creditcardinfo> |
表 1 中的 xml 文档描述了 peter 的信用卡支付记录。在按照 xml 数字签名规范对整个文档签名之后,生成的 xml 文档如表 2 所示:
表 2 签名后的 xml 文档
|
1. <?xml version="1.0" encoding="utf-8" standalone="no"?> 11. <signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 23. <signaturevalue> 24. <keyinfo> 44. </paymentinfo> |
所有与 xml 数字签名相关的信息都存放在 <signature> 元素中。<signature> 元素包含有几个主要的子元素:
- <reference> 元素至少包含一个 <reference> 元素,每个 <reference> 元素用于对待签名数据进行引用,包含有引用方式、转换方法、摘要算法和摘要值等信息
- <reference> 还包含有 xml 数据的规则化方法,并指定了数字签名所使用的算法。
- <signaturevalue> 元素包含对 <reference> 元素规范化后的内容进行签名生成的数字签名的值。
- <keyinfo> 元素用于指定验证签名所需的公共密钥相关信息。
xml 数字签名的过程大致为:
1. 根据每个 <reference> 元素中指定的资源引用方式,摘要算法,数据转换方法等信息,对引用资源进行转换,然后对转换后的结果计算出摘要值。
2. 根据 <signedinfo> 元素中指定的 xml 数据的规范化方法对 <signedinfo> 规则化,对规范化之后的数据生成摘要值,并使用私钥对摘要值进行加密,将生成的加密摘要值存放在 <signaturevalue> 元素中。
……

闽公网安备 35060202000074号