XML签名大全

本文比较全面地介绍了XML签名,但并未深入探究。本人水平有限,错误难免,欢迎指正,共同探讨。

  目录:

XML签名概览... 1

简介... 1

为什么需要XML签名... 1

数字签名... 2

XML签名语法... 2

应用... 4

实现... 4

参考... 4

  简介

  XML签名是一种基于XML格式的签名规范。它是W3C最早的XML安全方面的推荐标准规范。设计的XML签名带有多个目标,可提供“对任何数据类型的完整性、消息认证、和/或签名者认证服务, 无论是在包括该签名的 XML 内部还是在别处(这对因特网的发展意义重大)。”

  XML实质上是定义了一些XML标签,通过这些标签来达到对XML文档或其他数据进行签名的目的。

  本文首先说明XML签名解决的问题,然后再从数字签名原理、XML签名语法、应用等各方面讲述XML签名。

  为什么需要XML签名

  互联网在快速发展的同时,带来了许多安全方面的挑战。数据传输的机密性、完整性,消息认证,数据不可抵赖性等,都是在应用时需要高度重视的。正如简介中所说,XML签名能够解决完整性、消息认证和不可抵赖性(即签名者认证服务)。

  完整性:即保证数据在传输过程中不被篡改。

  消息认证:使数据接收者能够确定消息来源的一项服务。

  不可抵赖性:使数据发送者不能对自己已经发送数据的行为进行否认的一项服务。

  同时,XML签名是完全基于XML的,这使得它的应用将十分方便。还有一点很重要,它是W3C的推荐标准(要知道因特网上的应用,标准是十分重要的)。

  数字签名

  数字签名是密码学中非常重要的一个领域,应用十分广泛。

  密码学主要分为对称和非对称两大类,其区别在于加解密密钥是否相同。非对称密码学又称公私钥密码学,是近代密码学一个非常重大的突破。非对称加密的加解密密钥不同,一般称其中一个为私钥,另一个为公钥。私钥为用户私有,公钥通过某种机制公布,并且两者无关联(并非完全没有联系,是指从一个无法推的得另一个)。由于它使用两种不同的密钥,因而称为非对称,并且因此可以用于消息认证和防抵赖。

  在应用数字签名时,一般都会配合使用消息摘要算法(因为如果直接对原数据进行加密签名的话,会使签名十分冗长。所以先计算其摘要,再对摘要进行签名)。消息摘要算法也是密码学中很重要的一个方面。它是一种单向函数,对原数据进行变换并获得摘要值(一般512位)。它的特点是攻击者无法针对一个摘要逆向生成产生此摘要的原数据,由此可知它是提供完整性服务的关键。

  下面是一个简单的应用模式:

  注:XML签名规范是包括摘要部分的XML签名语法,首先看个例子:

[来源于“XML-Signature Syntax and Processing”]

  [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>

  开始为一个Signature标签,表示这是一个XML签名。

  2-12行为SignedInfo,其中Reference中指明签名的对象,以及原数据的摘要。

  13行为签名值。

  14-16行为KeyInfo标签,指明签名使用的公钥信息。

  例子中出现的标签,以及为出现的标签,将在下面简要介绍。

  [更加具体的说明以及相关的XML Schema或DTD可以参考“XML-Signature Syntax and Processing”]

  1、  名称空间

xmlns:ds="http://www.w3.org/2000/09/xmldsig#"为XML签名使用的名称空间。

  2、  Signature标签

  标识了特定环境下的一个完整XML签名。包括子元素<SignedInfo>、<SingatureValue>、<KeyInfo>和<Object>,其中后两个可选。属性有Id,作为签名的标识。

  3、  SignedInfo标签

  最复杂的一个标签,指明了规范化方法、数据源、签名算法、摘要算法、摘要值以及签名变换等。包括<CanonicalizationMethod>、<SignatureMethod>、<Reference>三个标签,其中Reference标签可以有多个,即签名可以指定多个数据源。属性Id为标识。

  3.1、<CanonicalizationMethod>标签

  空标签。属性Algorithm用URI方式指定规范化的算法。

  3.2、< SignatureMethod >标签

       空标签。属性Algorithm用URI方式指定签名的算法。

  3.3、<Reference>标签

  < DigestMethod>和< DigestValue>标签分别指定摘要的算法和值。属性Id为标识,URI指定数据源。< Transforms>指定签名变换,由零至多个<Transform>子标签构成。每个<Transform>子标签为一种签名变换。这里的变换指的是签名之前对需要签名的数据进行的一种变换。<Transform>标签的Algorithm属性指定签名变换算法。

  4、  <KeyInfo>标签

  (可选。因为在实际应用中,上下文可能已经隐含了这个信息,或者双方通过其他约定来传递这个信息)

  包含<KeyName>、<KeyValue>、<RetrievalMethod>、<X509Data>、<PGPData>、<SPKIData>、<MgmtData>子标签。

  4.1、<KeyName>标签

  密钥名称的简单文本标识符。

  4.2、<KeyValue>标签

       RSA或DSA公钥。

  4.3、<RetrievalMethod>标签

  允许远程访问密钥信息。

  4.4、<X509Data>标签

       X.509证书数据。

  4.5、<PGPData>标签

       PGP相关数据。

  4.6、<SPKIData>标签

       SPKI相关数据。

  4.7、<MgmtData>标签

       密钥共识参数(如Diffie-Hellman参数等)

  5、  <Object>标签

  用于附加信息。

  再次强调,这里只是简要介绍,更加详细的说明参考“XML-Signature Syntax and Processing”。

  应用

  XML签名可以作为其他标准框架的一部分使用,当然也可以独立适用,自己定义一个框架,自己生成和解析XML签名。XML签名已经广泛应用于WS-Security中,具体可参阅WS-S的内容。

  实现

  现在已经出现了很多XML签名开发包。主要有IBM的XML Security Suite和apache的XML Security。其中实现了XML签名生成和校验的API(Java)。

  IBM的XML Security Suite:
http://www.alphaworks.ibm.com/tech/xmlsecuritysuite/download

  apache的XML Security:http://xml.apache.org/security/index.html

参考:

《XML安全基础》清华出版社

http://www.w3.org/Signature/

http://www.w3.org/TR/xmldsig-core/

http://www-128.ibm.com/developerworks/cn/

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先需要了解 SOAP 协议,它是一种基于 XML 的协议,用于应用程序之间的通信。SOAP 协议通常使用 HTTP 或 HTTPS 作为传输协议。在调用带 sign 签名XML 接口时,需要注意以下步骤: 1. 创建 SOAP 请求消息体:根据接口文档定义,创建 SOAP 请求消息体,包含请求头和请求体。请求体中需要包含接口所需参数和签名信息。 2. 对请求消息体进行签名:使用签名算法对请求消息体进行签名签名算法的具体实现需要根据接口文档定义,一般情况下常用的算法有 MD5、SHA-1 等。 3. 将签名信息添加到 SOAP 请求消息体中:将签名信息添加到请求消息体中,以便服务端能够验证请求的合法性。 4. 发送 SOAP 请求:将 SOAP 请求发送到服务端,等待服务端响应。 5. 解析 SOAP 响应消息体:根据接口文档定义,解析服务端返回的 SOAP 响应消息体,获取接口返回结果。 下面是一个示例代码,对上述步骤进行了具体实现: ```java // 创建 SOAP 请求消息体 SOAPMessage soapMessage = MessageFactory.newInstance().createMessage(); SOAPPart soapPart = soapMessage.getSOAPPart(); SOAPEnvelope soapEnvelope = soapPart.getEnvelope(); SOAPBody soapBody = soapEnvelope.getBody(); // 添加请求参数 SOAPElement requestParam = soapBody.addChildElement("requestParam"); requestParam.addTextNode("参数值"); // 对请求消息体进行签名 String sign = sign(soapBody.toString()); // 将签名信息添加到 SOAP 请求消息体中 SOAPElement signElement = soapBody.addChildElement("sign"); signElement.addTextNode(sign); // 发送 SOAP 请求 SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); SOAPConnection soapConnection = soapConnectionFactory.createConnection(); URL endpoint = new URL("接口地址"); SOAPMessage response = soapConnection.call(soapMessage, endpoint); // 解析 SOAP 响应消息体 SOAPBody responseBody = response.getSOAPBody(); String result = responseBody.getElementsByTagName("result").item(0).getTextContent(); ``` 其中,sign() 方法是用于对 SOAP 请求消息体进行签名的自定义方法,具体实现根据签名算法的不同而有所差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值