XML
Signature规范是数字签名和XML的组合,不应将其视为XML
Signature只是将数字签名技术应用于XML文件。
XML Signature具有以下功能:
1.XML Signature是统一资源(URI格式)
identifier )所在的资源上签名。 它不仅包含与签名相同的XML文件中的元素,还包含其他XML文件中的元素。 另外,即使是图形文件等XML以外形式的资源,只要是可以在URI中搜索的资源,也可以应用XML
信号。
这还表明XML签名中的对象会动态变化。
2.XML
Signature可以签名XML文件中的任何元素,也可以签名整个文件。
3.XML签名可以用非对称密钥签名(
Signature (),用对称密钥签名) HMAC )。
XML信号的结构如下:
(
(传输?
(诊断方法)
(DigestValue
)
(KeyInfo?
(对象) *
(x )? 代表x出现0-1次(x ) ) ) )。
代表x出现1-n次*
表示x出现0-n次
现在,我将简要介绍Signature中出现的每个元素。 SignedInfo表示最终要签名的对象。 签名主要由两个过程组成:先汇总要签名的对象,然后加密摘要。 DSA的效果类似于混合摘要和密钥,而不是加密摘要。 XML
Signature签名的对象不仅包含您引用的对象,还包含其他元素,如CanonicalizationMethod
签名方法元素。 已签署整个SignedInfo元素。
CanonicalizationMethod描述了一种标准化XML元素的方法。 XML签名与常规签名的不同之处在于XML元素的特殊性。 例如,同一XML文档在Windows上的显示方式与在Linux上的显示方式不同。 因为相同的换行符在不同的操作系统中表示的字符不同。 但是,不能因此认为XML元素不同,因为一个XML元素的两个属性的位置改变并不破坏XML文件的完整性,所以必须在XML元素签名之前进行标准化处理。 此元素指定如何处理它。
SignatureMethod指定用于签名的方法,例如用于摘要的方法,以及是使用不对称密钥还是对称密钥加密(或混合)。
引用表示您真正想要签名的对象,通过URI导航到要签名的对象(一个xml元素或其他),如果未指定URI,则表示要签名的整个xml文件。
Transforms表示在签名之前可能对被签名对象进行的转换。 例如,如果要签名的对象是二进制资源,则必须在Base-64中进行转换,以避免该对象可能出现不正确的XML格式。 这里还可以使用其他转换方法,如XPATH和XSLT。
DigestMethod指定如何汇总引用,通常使用SHA1。
DigestValue中存储了进行摘要的结果,在以后进行SignedInfo签名时间接对引用对象进行签名,保证了完整性。
SignatureValue此处存储了“签名信息元素标准化”(CanonicalizationMethod )后“签名方法”(SignatureMethod )的结果。
KeyInfo是可选的,用于查找消息收件人验证签名所需的密钥。 例如,使用特定的名称id(identity )表示密钥,消息收件人可以根据该id找到验证签名所需的密钥。 如果消息交换双方都事先约定了签名的密钥,则可以省略该要素。
Object用于定义一些扩展信息,是可选的。
其中,XML基于被签名对象(Reference内URI所指示的对象)和Signature要素的位置关系
Signature进行了分类。
如果被签名对象是Signature的子元素,则此签名属于Enveloping
Signatures类型。 如果Signature是被签名对象的子元素,则签名属于Enveloped
Signatures类型。 如果不是任何一个,则为Detached
Signatures类型。
xmlns=' http://www.w3.org/2000/09/xmldsig # '
.
.
Stuff to be
已签名
环境信号
125356
17
xmlns=' http://www.w3.org/2000/09/xmldsig # '
>...
...
Enveloped Signatures
id="po1">
12366
17
xmlns="http://www.w3.org/2000/09/xmldsig#">
...
...
Detached Signatures 1
xmlns="http://www.w3.org/2000/09/xmldsig#">
/>
...
...
Detached Signatures 2
在了解了XML Signature的结构的基础上,再来看看XML
Signature的处理过程,其中包括了Signature的创建以及验证过程。
在创建Signature的时候分为两个步骤:
1. 引用(Reference)的创建
1.1 利用URI定位到引用的资源,并获得其数据。
1.2
利用Transforms元素中指定的方法对引用的资源做转换。
1.3
利用DigestMethod元素中指定的方法对转换后的资源做摘要,获得的结果用于创建DigestValue元素。
1.4
将以上元素组合成Reference元素。
URI="http://www.foo.com/securePage.html">
Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"
/>
60NvZvtdTB+7UnlLp/H24p7h4bs=
2. 签名(Signature)的创建
2.1
创建SignedInfo元素,并指定CanonicalizationMethod
和SignatureMethod的方法,然后将之前创建的Reference元素包含进来。
2.2
根据指定的CanonicalizationMethod将刚创建的SignedInfo元素标准化。
2.3
根据指定的SignatureMethod对标准化后的SignedInfo元素做签名,所得到的结果用于创建SignatureValue元素。
2.4
将SignedInfo,SignatureValue以及可选的KeyInfo和Object元素组合成Signature元素。
经过以上步骤,Signature创建完毕。最后介绍消息的接受方如何对Signature进行验证,从而确认消息的完整性。
Signature的验证过程和创建过程一样也分为两个步骤,只有当Reference,
Signature都通过验证才能保证消息的完整性。首先在验证前利用CanonicalizationMethod元素中指定的方法将整个Signature元素标准化,然后开始验证各个部分:
1. 引用(Reference)的验证
1.1 利用URI定位到引用的资源,并获得其数据。
1.2
利用Transforms元素中指定的方法对引用的资源做转换。
1.3
利用DigestMethod元素中指定的方法对转换后的资源做摘要。
1.4
将上一步的结果与DigestValue中的内容做比较,如果完全一致,则通过验证。
2. 签名(Signature)的验证
2.1
获得用于验证的密钥。(可能事先已经约定好,也可能通过KeyInfo中的信息取得)
2.2 对经过标准化的SignedInfo元素做摘要。
2.3
利用在第一步中获得的密钥解密SignatureValue元素中的内容,将其与上一步创建的摘要做比较,如果完全一致,则通过验证。如果使用了数字签名(非对称密钥),那么消息还将具有抗否认性。
当以上的两个验证都通过时,可以得到以下的结论:
1.
消息在传送以及保存的过程中都没有被别人算改。
2.
消息的发送方与签名方一致(身份鉴别)。
因为密钥只有消息的发送方和消息的接受方知道。
3.
如果使用了数字签名(非对称密钥加密摘要),
那么还可以防止消息的发送方否认它曾经发送过此消息。