介绍

如您所知,XML在我们的产品或项目开发中起着重要作用,并且从XML文档中我们收集了很多信息,而且我们可以对XML文件执行CRUD操作。 但是,关于如何确保XML文件中可用的数据是真实的以及数据来自受信任的可靠来源,这是一个令人关注的问题。 关于来自XML文件的数据的真实性或独创性,可能存在许多问题。 对于开发人员而言,不考虑数据真实性而处理XML文档是一种惯例。 但是在某些情况下,您需要解决以上各行提出的所有观点和问题。 让我们考虑一下现实世界的情况,每当我们收到邮局的信件或邮件时,我们如何知道这封信是来自我们的朋友的? 它基于他/她的典型陈述或单词或地址详细信息。 这可能是他/她的角色签名。 有时,我们收到的信件也可能被陌生人通过添加另一页所修改。 由于所有这些原因,我们通常会验证朋友的手写签名。 这都是关于普通邮局的信。 电子讯息呢? 我们如何验证电子消息的真实性? 在这种情况下,我们必须采用该技术进行数字签名。 在本文中,我将简要介绍XML数字签名,它对我们的数据完整性起着重要作用。 在本文中,我将向您展示如何将数字签名附加到XML文档,以及如何使用附加的签名验证XML文档。

技术性

在过去的两年中,XML Digital Signature获得了强劲的发展,尤其是在金融领域。 在开始使用XML Digital签名之前,让我们考虑一个典型的场景以供我们理解。 考虑一个组织以XML文档的形式将其雇员的所有工资详细信息发送给所得税部门的情况。 现在是一个问题,所得税部门如何验证XML文件? 这意味着IT部门必须验证组织中所有员工的敏感信息。 IT部门必须确保XML文档来自受信任的来源,并且在进入IT部门时尚未对其进行修改。 这意味着文档之间没有进行调整。 首先,我们必须了解数字签名的概念。 数字签名是一种电子签名,用于验证受信任人员发送的文档的真实性。 它还可以确保文档原始内容在传输过程中没有被修改。 数字签名可以与任何消息一起使用,无论它是否经过加密,以便接收者可以确定发送者的身份,并且该消息不会被陌生人更改。 根据Wikipedia的说法,数字签名是一种数学方案,用于证明数字消息或文档的真实性。 有效的数字签名使收件人有理由相信该邮件是由已知的发件人创建的,从而使发件人无法否认已发送了该邮件(身份验证和不可否认),并且该邮件在传输过程中没有发生更改(完整性)。 数字签名通常用于软件分发,金融交易,以及在其他情况下检测伪造或篡改非常重要的情况。

让我们看一个带有数字签名的完整XML文档。

<?xml version="1.0" encoding="UTF-8" standalone="no"?><SalaryDeposit><Organisation><Name>DDLab Inc</Name><AccountNo>SBC-12345789</AccountNo></Organisation><Employees><Emp><Name>John Abraham</Name><AccountNo>SB-001</AccountNo><Amount>1234</Amount></Emp><Emp><Name>Bipasha Basu</Name><AccountNo>SB-002</AccountNo><Amount>2334</Amount></Emp><Emp><Name>Vidya Balan</Name><AccountNo>SB-003</AccountNo><Amount>3465</Amount></Emp><Emp><Name>Debadatta Mishra</Name><AccountNo>SB-007</AccountNo><Amount>5789</Amount></Emp><Emp><Name>Priti Zinta</Name><AccountNo>SB-009</AccountNo><Amount>1234</Amount></Emp></Employees><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>bHS+6uf8KbJV4AGzoHNHLfnXvKM=</DigestValue></Reference></SignedInfo><SignatureValue>
aUEMrCT5dzeOfSNaznzoT0If8WZ8KQcMNXDqtoeseonVk3NqOk9ctcxrf3QVX3wP6810DDRPdI6le8ccG64Ge0HjkO+aYC5+c2L/qKBzwtSbl/olJEuFU2DVxBQO+K29TTUJfxpVzC9Zf2pvT+1NRj0f2/ofHujYZ01D6+YqI8c=</SignatureValue><KeyInfo><KeyValue><RSAKeyValue><Modulus>
jfAd5uV38L36+lDZJrqfH9oLN86VJezXYfAeU+lrFoHlKAXVJLAi9hKvBHQRer4tPfdez6iSBKsl6IHkPnVRAKt0xU99uxi5QpymsWAX3qnBqHlw9Z70PwyZ+Xysfw4Q2tK2HtSgUOhMuaUcIf9sbHvfgbvcRPgxDZZqfIzDmDU=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue></KeyInfo></Signature>
</SalaryDeposit>

上面的XML文件是经过数字签名的文件,可以在任何时间进行验证。 上面的XML文件包含有关员工姓名,帐号和薪水金额的信息。 但是实际的数字签名附加在标签<Signature> </ Signature>中。 <Signature>中的信息提供了文档的真实性。 由于可以看到数据,因此可以自由更改数据,但是在签名验证过程中将失败。

基本上,存在三种类型的XML签名。

  • 信封签名
  • 信封签名
  • 分离的签名

信封签名

在这种情况下,签名是经过签名的XML对象的子级。 这意味着<Signature>是邮件XML文档中的子XML标记。 以下是信封数字签名的结构。

<RootElement>
<Signature>
……………………
</Signature>
</ RootElement>

在本文中,我将向您介绍如何创建封装的XML数字签名。

信封签名

在这种情况下,XML文档仍保留在Signature对象中。 这意味着<Signature>标记将成为已签名XML文档的根元素。 以下是信封数字签名的概述。

<Signature >
< MyXMLDocument >
…
</ MyXMLDocument >
</Signature>

分离签名

在这种情况下,数字签名是独立生成的,并且不是XML文档的一部分。 这意味着您将有两个XML文件,一个是要签名的XML文件,另一个是XML签名。 让我们看一下XML文档的骨架结构。

<Signature>
…………..
</Signature>

现在让我们在下面看到典型XML数字签名的骨架结构。

<Signature xmlns="">
<SignedInfo>
<CanonicalizationMethod
Algorithm="" />
<SignatureMethod Algorithm="" />
<Reference URI="">
<Transforms>
<Transform Algorithm="" />
</Transforms>
<DigestMethod Algorithm="" />
<DigestValue></DigestValue>
</Reference>
</SignedInfo>
<SignatureValue></SignatureValue>
<KeyInfo>
<KeyValue>
<RSAKeyValue>
<Modulus></Modulus>
<Exponent></Exponent>
</RSAKeyValue>
</KeyValue>
</KeyInfo>
</Signature>

XML标签<Signature>基本上包含3个子标签。 它可以被视为

<Signature>
<SignedInfo></SignedInfo>
<SignatureValue></SignatureValue>
<KeyInfo></KeyInfo>
</Signature>

这里的<Signature>是XML数字签名概念的根元素,并且它是W3C所必须遵循的协议。 <SignedInfo>元素是您签名的信息。 <SignatureValue>包含带有Base64编码内容的实际签名,最后<KeyInfo>表示公共密钥。 再次让我们看一下<SignedInfo>标签。 <SignedInfo>的结构如下。

<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>bHS+6uf8KbJV4AGzoHNHLfnXvKM=</DigestValue>
</Reference>
</SignedInfo>

在java中创建XML数字签名时,SignedInfo对象用于在数字签名的Signature标签内创建一个元素。 这也是W3C建议的XML数字签名协议的一部分。

现在让我们看一下下面的XML标签<KeyInfo>结构。

<KeyInfo>
<KeyValue>
<RSAKeyValue>
<Modulus></Modulus>
<Exponent></Exponent>
</RSAKeyValue>
</KeyValue>
</KeyInfo>

<KeyInfo>标记包含数学计算的信息,基本上它包含公钥的模数和指数。

为了创建XML数字签名,请遵循以下步骤。

  1. 生成一对称为私钥和公钥的密钥。
  2. 获取原始XML文档。
  3. 通过Java API使用私钥和公钥对原始XML文档签名,然后生成另一个具有XML数字签名的文档。

让我们看一下用于生成XML数字签名的简短Java代码段。

public void generateXMLDigitalSignature(String originalXmlFilePath,
String destnSignedXmlFilePath, String privateKeyFilePath, String publicKeyFilePath) {
//Get the XML Document object
Document doc = getXmlDocument(originalXmlFilePath);
//Create XML Signature Factory
XMLSignatureFactory xmlSigFactory = XMLSignatureFactory.getInstance("DOM");
PrivateKey privateKey = new KryptoUtil().getStoredPrivateKey(privateKeyFilePath);
DOMSignContext domSignCtx = new DOMSignContext(privateKey, doc.getDocumentElement());
Reference ref = null;
SignedInfo signedInfo = null;
try {
ref = xmlSigFactory.newReference("", xmlSigFactory.newDigestMethod(DigestMethod.SHA1, null),
Collections.singletonList(xmlSigFactory.newTransform(Transform.ENVELOPED,
(TransformParameterSpec) null)), null, null);
signedInfo = xmlSigFactory.newSignedInfo(
xmlSigFactory.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE,
(C14NMethodParameterSpec) null),
xmlSigFactory.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
Collections.singletonList(ref));
} catch (NoSuchAlgorithmException ex) {
ex.printStackTrace();
} catch (InvalidAlgorithmParameterException ex) {
ex.printStackTrace();
}
//Pass the Public Key File Path
KeyInfo keyInfo = getKeyInfo(xmlSigFactory, publicKeyFilePath);
//Create a new XML Signature
XMLSignature xmlSignature = xmlSigFactory.newXMLSignature(signedInfo, keyInfo);
try {
//Sign the document
xmlSignature.sign(domSignCtx);
} catch (MarshalException ex) {
ex.printStackTrace();
} catch (XMLSignatureException ex) {
ex.printStackTrace();
}
//Store the digitally signed document inta a location
storeSignedDoc(doc, destnSignedXmlFilePath);
}

XML签名验证

XML数字签名验证涉及以下操作。

  • 验证数字签名

    • 计算<SignedInfo>元素的摘要

为了验证签名的XML文档,请按照下列步骤操作。

  1. 同时获取签名的XML文档和公共密钥。
  2. 验证<SignedInfo>元素的数字签名
  3. 计算<SignedInfo>元素的摘要并比较这些值。

让我们看一下XML数字签名验证的简短Java代码段。

public static boolean isXmlDigitalSignatureValid(String signedXmlFilePath,
String pubicKeyFilePath) throws Exception {
boolean validFlag = false;
Document doc = getXmlDocument(signedXmlFilePath);
NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
if (nl.getLength() == 0) {
throw new Exception("No XML Digital Signature Found, document is discarded");
}
PublicKey publicKey = new KryptoUtil().getStoredPublicKey(pubicKeyFilePath);
DOMValidateContext valContext = new DOMValidateContext(publicKey, nl.item(0));
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
validFlag = signature.validate(valContext);
return validFlag;
}

因此,从上面的代码中可以明显看出,可以使用<SignatureMethod>元素中指定的摘要算法重新计算<SignedInfo>元素的摘要值并使用公钥来验证XML签名,以验证该值<SignatureValue>元素的摘要对于<SignedInfo>元素的摘要值是正确的。 在<SignedInfo>元素内重新计算引用的摘要,并将它们与每个<Reference>元素的相应<DigestValue>元素中包含的摘要值进行比较。 仍然让我们熟悉一些负责XML数字签名的java组件。

XMLSignatureFactory

它是一个工厂对象,用于使用“ DOM”机制类型为XML文档生成数字签名。 以下列方式创建对象。

XMLSignatureFactory factory = XMLSignatureFactory.getInstance("DOM");

DOMSignContext

DOMSignContext对象用于形成DOM树,其中在创建数字签名时将附加XML数字签名。 该对象接受私钥和XML文档的根元素。

参考

引用对象用于在XML数字签名的主要Signature标签的SignedInfo元素内作为元素创建。 该对象创建一个标签,作为W3C XML签名语法和处理规则的一部分。 参考元素的基本结构如下。

<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>bHS+6uf8KbJV4AGzoHNHLfnXvKM=</DigestValue>
</Reference>

SignedInfo

类似地,SignedInfo对象用于在数字签名的Signature标签内创建一个元素。 这也是W3C建议的XML数字签名协议的一部分。

基本结构如下。

<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>bHS+6uf8KbJV4AGzoHNHLfnXvKM=</DigestValue>
</Reference>
</SignedInfo>

XML签名

最后,创建XMLSignature对象以形成签名标签,该签名标签用作附加到XML文档的信封。 按照W3C准则,这是XML数字签名的根元素。

完整的结构如下。

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>bHS+6uf8KbJV4AGzoHNHLfnXvKM=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>aUEMrCT5dzeOfSNaznzoT0If8WZ8KQcMNXDqtoeseonVk3NqOk9ctcxrf3QVX3wP6810DDRPdI6l
e8ccG64Ge0HjkO+aYC5+c2L/qKBzwtSbl/olJEuFU2DVxBQO+K29TTUJfxpVzC9Zf2pvT+1NRj0f
2/ofHujYZ01D6+YqI8c=</SignatureValue>
<KeyInfo>
<KeyValue>
<RSAKeyValue>
<Modulus>jfAd5uV38L36+lDZJrqfH9oLN86VJezXYfAeU+lrFoHlKAXVJLAi9hKvBHQRer4tPfdez6iSBKsl
6IHkPnVRAKt0xU99uxi5QpymsWAX3qnBqHlw9Z70PwyZ+Xysfw4Q2tK2HtSgUOhMuaUcIf9sbHvf
gbvcRPgxDZZqfIzDmDU=</Modulus>
<Exponent>AQAB</Exponent>
</RSAKeyValue>
</KeyValue>
</KeyInfo>
</Signature>

要完全理解,请从该站点下载完整的Netbeans项目,其中包含完整的源代码。

组态

您可以从此站点下载Java中XML数字签名的完整项目,也可以从下面的保管箱链接下载。

  • https://www.dropbox.com/s/0k1iukhy0in6n8h/xmldigitalsignature1.zip

您可以在您喜欢的Java IDE中配置该项目,然后运行测试源文件夹中提供的独立程序。 该项目已经包含私钥和公钥。 如果要生成,请运行Java类“ TestGenerateKeys”以生成一对密钥。 您还可以提供自己的XMl文件的路径,以查看XML数字签名是如何生成的。

结论

希望您喜欢我关于Java中的XML数字签名的文章。 创建XML数字签名的方法也很多,我仅提供了使用Java API生成封装的数字XML签名的方法。 下载完整的项目并查看源代码,以了解概念及其用法。 为了更清楚起见,我在资源和参考部分中提供了一些基本链接。 如有任何问题和错误,请随时通过debadatta.mishra@gmail.com与我联系。

资源与参考

  • http://en.wikipedia.org/wiki/XML_Signature
  • http://msdn.microsoft.com/en-us/library/ms996502.aspx
  • http://www.xml.com/pub/a/2001/08/08/xmldsig.html

翻译自: https://www.javacodegeeks.com/2013/10/xml-security-with-digital-signature-in-java.html

JAVA中带有数字签名的XML安全性相关推荐

  1. xml 数字签名 破解_JAVA中带有数字签名的XML安全性

    xml 数字签名 破解 介绍 如您所知,XML在我们的产品或项目开发中起着重要作用,并且从XML文档中我们收集了很多信息,并且我们可以对XML文件执行CRUD操作. 但是,关于如何确保XML文件中可用 ...

  2. java解析xml实例_在java中使用dom解析xml的示例分析

    本篇文章介绍了,在java中使用dom解析xml的示例分析.需要的朋友参考下 dom是个功能强大的解析工具,适用于小文档 为什么这么说呢?因为它会把整篇xml文档装载进内存中,形成一颗文档对象树 总之 ...

  3. JAVA中利用DOM解析XML文档

    JAVA中利用DOM解析XML文档 package org.sws.utils; import java.io.File;import java.io.IOException; import java ...

  4. 如何在Java中针对XSD验证XML

    Java XML Validation API can be used to validate XML against XSD in java program. javax.xml.validatio ...

  5. 在Java中使用xpath对xml解析

     个人博客地址:https://www.vastyun.com xpath是一门在xml文档中查找信息的语言.xpath用于在XML文档中通过元素和属性进行导航.它的返回值可能是节点,节点集合,文本, ...

  6. 针对Java中的XSD验证XML

    有许多工具可用于根据XSD 验证XML文档 . 其中包括操作系统脚本和工具,例如xmllint ,XML编辑器和IDE,甚至是在线验证器. 由于前面提到的方法的局限性或问题,我发现拥有自己的易于使用的 ...

  7. Java中带有JWebSocket的WebServerSocket

    首先,转到http://jwebsocket.org/下载2个软件包Server and Client. 如果要查看源代码,请下载源代码包. 服务器 解压缩服务器程序包. 转到" conf& ...

  8. java xsd校验,java中使用xsd验证xml | 学步园

    1. 首先要导入包,axiom包请到apache上下载 2. xsd和xml 文件放在工程 bin路径下即可. package xmlValidate; import java.io.ByteArra ...

  9. Java为xml跟节点添加子节点_如何将xml节点作为第一个子节点插入Java中的另一个xml文档中?...

    小编典典 如果事实证明我只是为您做功课,我会感到非常恼火. package com.akonizo.examples; import java.io.ByteArrayInputStream; imp ...

最新文章

  1. AI突破难题才能预见未来
  2. java实现高斯赛德尔算法解线性方程组
  3. 2017 清北济南考前刷题Day 2 afternoon
  4. 兰州大学萃英学院计算机,兰州大学萃英学院.PDF
  5. python用pip安装numpy mac_小白入门Python,mac下如何安装pip、ipython
  6. maven 插件使用之:打包jar到lib
  7. python 二叉树递归时明明已经得到了结果,但是返回None
  8. 表贴电阻尺寸与什么有关_0欧电阻存在的意义?看了就懂了
  9. Echarts鼠标悬浮样式
  10. DirectX 初始化DirectX(手写和红龙书里面的方式)
  11. c语言关于完数(完全数,完美数)的判断及寻找
  12. 5款精美APP原型设计模板,触手可得
  13. 七、常用类(高琪java300集+java从入门到精通笔记)
  14. 深入理解 LWUIT 框架的 MVC
  15. 开发电脑用 Windows 还是 Mac
  16. 2022年简历石沉大海,软件测试行业当前找工作有多难?
  17. Redis应用项目---抢红包功能(一)
  18. git 使用总结(三)repo sync -m
  19. e的近似求解方法matlab,3X^2-E^X并用matlab切线法求出所有实根的近似值,源程序
  20. MyEclispe发布web项目-遁地龙卷风

热门文章

  1. php类常量的特点,php类常量是什么?类常量用法详解
  2. php如何求同列元素之和_求得这个数组中各个元素之和
  3. thinking-in-java(13) String字符串
  4. compose应用_带有PostgreSQLDocker Compose for Spring Boot应用程序
  5. jep290涉及jdk版本_JDK 13中的JEP 355文本块
  6. corda_Corda服务的异步流调用
  7. vertx rest 跨域_Vertx编程风格:您的React式Web Companion REST API解释了
  8. javaserver_什么是JavaServer Faces(JSF)
  9. 产品原型示例_原型设计模式示例
  10. wildfly管理控制台_WildFly管理控制台已更新–请求反馈