XML Signature
XML Signature
一、XML Signature简介
XML Signature(也称作XMLDsig,XML-DSig,XML-Sig)是一个定义数字签名的XML语法的W3C推荐标准。从功能上或,XML Signature与PKCS#7有很多共同点,但是XML签名具有更好的可扩展性,并为签名XML文档做了调整。XML Signature在许多Web技术,如SOAP, SAML等中使用。
XML signature可以用来签名任何类型的数据(称作资源),最常见的是XML文档,但是任何可以通过URL访问的资源都可以被签名。如果XML签名用于对包含该签名的XML文档之外的资源签名,则称为detached signature如果XML签名用于对包含它的XML文档的某个部分进行签名,则称为enveloped signature;
如果XML签名包含被签名的数据,则称为enveloping signature。
二、XML Signature结构
一个XML签名包含一个Signature元素,其名字空间为http://www.w3.org/2000/09/xmldsig#。基本结构如下所示:
<Signature>
<SignedInfo>
<SignatureMethod />
<CanonicalizationMethod />
<Reference>
<Transforms>
<DigestMethod>
<DigestValue>
</Reference>
<Reference />等
</SignedInfo>
<SignatureValue />
<KeyInfo />
<Object />
</Signature>
说明:
SignedInfo元素包含或引用签名后的数据,并指出使用了那种算法。
SignatureMethod和CanonicalizationMethod元素被SignatureValue元素所使用,并包含在SignedInfo元素中以防止篡改。
一个或多个Reference元素通过URI引用的方式说明被签名的资源;以及在签名前对资源进行的任何转换。转换可以是一个XPath表达式,从文档树中选择一个子集。
DigestMethod元素指定散列算法。
DigestValue元素包含转换后资源经过散列算法的结果。SignatureValue元素包含一个经过Base64编码的签名结果 - 签名是按照SignedInfo元素中的SignatureMethod元素中指明的参数进行的,签名前要先根据CanonicalizationMethod元素中指定的算法进行规范化。
KeyInfo元素(可选)允许签名者为接收者提供验签该签名的密钥,通常是以一个或多个X.509数字证书的形式。如果没有出现KeyInfo元素,接收方必须从上下文中识别出验签的密钥。
Object元素(可选)包含被签名的数据,如果是enveloping signature(签名的数据在Signature元素内)的情况。
三、验证及考虑安全
当验证一个XML签名时,需要遵守一个称作核心验证(Core Validation)的程序:
1)引用验证:每一个引用的摘要都通过获取相应的资源,并且按照指定的转换方法和摘要方法进行转换和摘要,然后将结果与DigestValue元素中的内容进行比较,如果不匹配,验证失败。
2)签名验证:SignedInfo元素使用CanonicalizationMethod元素中指定的XML标准化方法进行处理,密钥或取自KeyInfo元素或通过其他方法取得,然后通过SignatureMethod指定的签名方法进行验签。
以上验证确定该资源是否是真的由宣称的当事人签名的。然而由于XML标准化和转换方法的可扩展性,验证方必须同时确认实际被签名或摘要的正式在原始数据中出现的内容,换句话说,确信签名或摘要所使用的算法没有改变被签名的数据的意思。
四、XML规范化
XML签名的产生要比通常的数字签名的产生复杂一点,这有由于一个给定的XML文档(在XML开发人员通用的说法是"XML信息集")可能包含合法的序列化的表达方式以外的内容。例如,在XML元素中的白空格从句法上说是没有意义的,因此<Elem >和<Elem>没有区别。
由于数字签名是由非对称密钥加密算法(通常是RSA加密算法)对序列化的XML文档进行散列(通常是SHA1)的结果进行加密。一个字节的差别会导致数字签名的不同。
此外,如果XML文档是在计算机间传输,不同操作系统的换行符可能不同,从CR到LF再到CR LF等。 对XML文档进行摘要和验证的程序可能随后以不同的方式呈现XML。例如,在元素定义的属性定义间添加额外的空格,或是使用相对的(而不是绝对的)URL,或者改变XML命名空间定义的顺序。标准化的XML对于引用远端文档的XML数字签名尤其重要,远端服务器可能会随时间改变XML呈现的方式。
为了避免这些问题,并保证逻辑上相同的XML文档会产生相同的数字签名,在对XML文档进行签名(在对SignedInfo进行签名时,规范化是强制的)时使用了一种XML规范化的转换(Canonicalization,通常缩写为C14n)这些算法保证逻辑上相同的文档产生完全相同的序列化的表达方式。
缺省的规范化算法处理命名空间生命的方式带来了另一个问题;通常来说一个被签名的XML文档需要嵌入另一个文档;在这种情形下,原来的规范化算法产生的结果与单独的文档规范化的结果不同。由于这个原因,一个被称为Exclusive Canonicalization的规范化算法产生了,该算法在序列化一个元素的XML命名空间声明时独立于该元素所嵌入的XML文档。
五、优缺点
优点:
与其他形式的数字签名,如Pretty Good Privacy和Cryptographic Message Syntax相比,XML Signature更加灵活,这是因为它操作的不是二进制数据,而是XML信息集,允许操作数据的子集,可以以不同形式将签名与被签名的信息结合,以及可以执行转换。另一个核心概念是标准化,也就是说仅对“精华”进行签名,而排除了无意义的区别,如白空格和换行符。
缺点:
通常,批评都对准XML安全的体系结构,以及在签名和加密XML数据前对XML进行规范化的适宜性,这是因为XML规范化的复杂性,内在的处理需求,以及性能不高的特性。争论在于执行XML标准化会导致额外的等待时间,这对事务的,性能敏感的SOA应用来说简直难以克服。这些问题正在XML安全工作组进行解决。 另一个问题是没有合适的策略,XML在SOAP中的使用和WS-Security可能导致容易受到攻击。
六、参考文档
https://en.wikipedia.org/wiki/XML_Signature
XML Signature相关推荐
- xml 数字签名 破解_JAVA中带有数字签名的XML安全性
xml 数字签名 破解 介绍 如您所知,XML在我们的产品或项目开发中起着重要作用,并且从XML文档中我们收集了很多信息,并且我们可以对XML文件执行CRUD操作. 但是,关于如何确保XML文件中可用 ...
- JAVA中带有数字签名的XML安全性
介绍 如您所知,XML在我们的产品或项目开发中起着重要作用,并且从XML文档中我们收集了很多信息,而且我们可以对XML文件执行CRUD操作. 但是,关于如何确保XML文件中可用的数据是真实的以及数据来 ...
- 基于xml的数据交换技术
XML数据交换的安全解决方案 摘 要:XML技术的发展使得基于网络的数据交互越来越方便,但是互联网开放性所带来的信息安全隐患却是一个日趋严重的问题.本文分析了基于XML的数据交换安全需求,介绍了XM ...
- XML数据交换的安全解决方案
摘 要:XML技术的发展使得基于网络的数据交互越来越方便,但是互联网开放性所带来的信息安全隐患却是一个日趋严重的问题.本文分析了基于XML的数据交换安全需求,介绍了XML安全服务标准.针对XML数据 ...
- XML之文档类型定义和合法性(转)
来至:liang--liang博客:http://www.cnblogs.com/liang--liang/archive/2008/01/15/1039277.html 好牛 XML被作为一种元标记 ...
- Java生成XML数字签名
为什么80%的码农都做不了架构师?>>> 一.生成证书文件 1.安装openssl,装好后输入openssl进入openssl交互界面 [root@kolbe ~]# yum ...
- 什么是XML?什么是XML数字签名?
什么是XML 可扩展标记语言(Extensible Markup Language)是一种简单且非常灵活的文本格式. XML指可扩展标记语言(EXtensible Markup Language) X ...
- xml基础知识(一)
声明:发表了才看到csdn博客的这个编辑器排版实在是不敢恭维,相当混乱.发表之前调整得很好,发表之后就全乱了.见谅. xml作为一种标记语言在现阶段得到了广泛的应用,最近学到了xml这种标记语言,于是 ...
- Android CTS 测试总结【转】
最近一直在做Android兼容性测试,根据Android官网给出的android-cts-manual 配置好了device后,开始测试. 首先配置软件环境: 1.下载Android-2.1系统,并编 ...
最新文章
- Docker学习笔记(4) — 开启Docker远程访问
- 通过SQL存储过程删除过期的数据库Bak备份文件
- mysql read file_MySQL利用OS读写文件的前提
- ASP.NET Core 中文文档 第三章 原理(1)应用程序启动
- 我爱计算机视觉干货集锦分类汇总(2019年6月17日)
- 详解API Gateway流控实现,揭开ROMA平台高性能秒级流控的技术细节
- LeafGAN:一种有效的实用植物病害诊断数据扩充方法
- python集合_Python集合
- mac上数据库管理工具Navicat Premium 连接mySQL
- Delphi——数组(静态数组和动态数组)、地址和指针
- 2020最新Java常见面试题及答案
- 有什么数学题库软件吗?4款学生必备APP,题库超全超好用!
- Linux修改系统时间
- 破局:技术视野与规划
- 阿里云服务器租用测试
- VeiwPager、Gallery、ViewFlipper区别
- 软件测试提交bug意思,软件测试bug定义及分类
- 科技的成就(三十六)
- java8 两个时间比较
- 递推算法之斐波那契数列——昆虫繁殖