用Java数字签名提供XML安全.doc_第1页
用Java数字签名提供XML安全.doc_第2页
用Java数字签名提供XML安全.doc_第3页
用Java数字签名提供XML安全.doc_第4页
用Java数字签名提供XML安全.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用Java数字签名提供XML安全分享到:本文由 ImportNew - 唐尤华 翻译自 javacodegeeks。如需转载本文,请先参见文章末尾处的转载要求。简介众所周知,XML在产品和项目开发中起着非常重要的作用。通过XML文档可以获取很多信息,还可以使用XML文件进行CRUD(增加、查询、更新和删除)操作。然而值得注意的是,我们如何确保XML中的数据是来自经过认证的可信和可靠的来源。关于XML文件数据的可靠性和真实性存在很多问题。通常的情况是,开发者直接处理XML文件而不去考虑数据的可靠性。有一些情况提出了上面的所有问题。现实生活中,每当我们从邮局收到一封信件时我们如何确定这封信是来自我们的朋友?依据可能是他/她的习惯用语、用词或者邮件详细地址。也可能是他/她的个性签名。如今,我们收到的信件可能被某人进行了篡改,添加了其他内容。基于上述原因,通常我们会验证朋友的手写签名。当然这些是关于来自邮局的普通邮件。电子消息又该如何?我们如何验证电子消息的真实性?这种情况我们会采用数字签名。本文会对保证数据完整性的XML数字签名技术进行简要介绍,并且展示如何为XML文件附加电子签名及其验证过程。使用的技术过去几年里,XML数字签名取得了快速发展,在金融领域尤其如此。在开始讨论之前,让我们考虑一个典型场景:想象一下,某个组织将所有雇员的薪资内容用XML文件发送给所得税部门。那么现在的问题是:所得税部门如何验证这份XML文件?这就是说,IT部门需要验证该组织的敏感信息。IT部门需要确保XML文件的来源可信,并且在IT部门收到之前没有经过篡改也就是说文档的内容没有在传递中被修改。首先,我们需要理解数字签名的概念。数字签名是一种用来验证文档发自可信方的电子签名。它确保了文档的原始内容在传输中没有受到修改。数字签名可以用于任何加密和非加密消息,因此接收方可以识别发送者的身份,并确认消息没有被其他人修改。根据维基百科的定义:“数字签名是一种验证数字信息或文档的数学方法”。一个有效的数字签名可以让接收者确认收到的消息来自已知发送方,发送者不能否认自己发送了此消息(提供认证和不可否认性)并且此消息在传输中未经修改(提供完整性)。数字签名通常被用在软件发布、金融事务和其他需要检测伪造或篡改的重要场合。下面让我们来看完整的一个带有数字签名的XML文件:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 DDLab Inc SBC-12345789 John Abraham SB-001 1234 Bipasha Basu SB-002 2334 Vidya Balan SB-003 3465 Debadatta Mishra SB-007 5789 Priti Zinta SB-009 1234 bHS+6uf8KbJV4AGzoHNHLfnXvKM= aUEMrCT5dzeOfSNaznzoT0If8WZ8KQcMNXDqtoeseonVk3NqOk9ctcxrf3QVX3wP6810DDRPdI6l e8ccG64Ge0HjkO+aYC5+c2L/qKBzwtSbl/olJEuFU2DVxBQO+K29TTUJfxpVzC9Zf2pvT+1NRj0f 2/ofHujYZ01D6+YqI8c= jfAd5uV38L36+lDZJrqfH9oLN86VJezXYfAeU+lrFoHlKAXVJLAi9hKvBHQRer4tPfdez6iSBKsl 6IHkPnVRAKt0xU99uxi5QpymsWAX3qnBqHlw9Z70PwyZ+Xysfw4Q2tK2HtSgUOhMuaUcIf9sbHvf gbvcRPgxDZZqfIzDmDU= AQAB 上面是一个带有签名的XML文件,该文件可以随时进行验证。文件中包了含雇员名称、帐号和薪资信息。然而,实际的数字签名通过标记进行附加。 标记中的信息提供了文档的真实性。正如你看到的那样,虽然你可以随意修改其中的数据,但是这种修改会在随后的签名验证中被查到。基本上数字签名有三种类型: 封内签名 封外签名 分离签名封内签名这种签名是将签名作为XML对象的子信息,也就是说 是邮件中XML文件的子标签。封内数字签名的结构如下:12345 本文会介绍如何创建XML封内数字签名。封外签名这种签名将XML文档包含到Signature对象,也就是说标签是签名XML文件的根元素。封外签名结构如下:12345 分离签名这种情况下,签名是独立生成的不作为XML的一部分。也就是说你会拥有两个XML文件:一个待签名的XML文件,另一个是XML签名。下面是分离签名的XML结构:123XML数字签名文件结构如下:12345678910111213141516171819202122 XML中有3个子标签,结构如下:12345 这里是XML数字签名的根元素,这一点由W3C建议并且必须遵守。元素是你的签名信息;包含了实际的签名以及使用Base64加密的内容;最后表示公钥。让我们再看一下标签,结构如下:1234567891011 bHS+6uf8KbJV4AGzoHNHLfnXvKM= 当使用Java创建XML数字签名时,SignedInfo对象被用来在数字签名的Signature标签内创建元素。这也是W3C建议的XML签名标准中的一部分。XML标签的结构如下:12345678 标记包含了需要数学计算的相关信息,主要有公钥的系数和指数。要创建XML数字签名可以遵循下列步骤:1 生成一组私钥和公钥。2 获得原始XML文件。3 通过Java API使用私钥和公钥为原始的XML文件签名,生成带有XML签名的文档。让我们看看使用Java生成XML签名的相关代码:12345678910111213141516171819202122232425262728293031323334353637383940414243publicvoidgenerateXMLDigitalSignature(String originalXmlFilePath,String destnSignedXmlFilePath, String privateKeyFilePath, String publicKeyFilePath) / 获取XML文档对象 Document doc = getXmlDocument(originalXmlFilePath); / 创建XML签名工厂 XMLSignatureFactory xmlSigFactory = XMLSignatureFactory.getInstance(DOM); PrivateKey privateKey =newKryptoUtil().getStoredPrivateKey(privateKeyFilePath); DOMSignContext domSignCtx =newDOMSignContext(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(); / 传入公钥路径 KeyInfo keyInfo = getKeyInfo(xmlSigFactory, publicKeyFilePath); / 创建新的XML签名 XMLSignature xmlSignature = xmlSigFactory.newXMLSignature(signedInfo, keyInfo); try / 对文档签名 xmlSignature.sign(domSignCtx); catch(MarshalException ex) ex.printStackTrace(); catch(XMLSignatureException ex) ex.printStackTrace(); / 存储签名过的文档 storeSignedDoc(doc, destnSignedXmlFilePath);XML签名验证数字签名的验证包含以下操作: 验证数字签名 计算元素摘要。 使用公钥解密元素。 比较上面两个值。 计算引用摘要 重新计算元素引用摘要。 将它们与中的摘要比较。为了验证XML签名文档,需要完成下列步骤:4 得到XML文档和公钥。5 验证 元素的数字签名。6 计算 元素的摘要并对值进行比较。让我们看看下面这段XML数字签名示例代码:123456789101112131415publicstaticbooleanisXmlDigitalSignatureValid(String signedXmlFilePath, String pubicKeyFilePath)throwsException booleanvalidFlag =false; Document doc = getXmlDocument(signedXmlFilePath); NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS,Signature); if(nl.getLength() =0) thrownewException(No XML Digital Signature Found, document is discarded); PublicKey publicKey =newKryptoUtil().getStoredPublicKey(pubicKeyFilePath); DOMValidateContext valContext =newDOMValidateContext(publicKey, nl.item(0); XMLSignatureFactory fac = XMLSignatureFactory.getInstance(DOM); XMLSignature signature = fac.unmarshalXMLSignature(valContext); validFlag = signature.validate(valContext); returnvalidFlag;如上面示例代码所示,XML签名可以通过重新计算的摘要值进行验证,验证算法由 元素指定;使用公钥可以验证摘要中的值是否正确。 引用摘要会在元素中重新计算,并与 元素中对应的 进行比对。接下来,让我们熟悉一下XML数字签名相关的Java组件。XMLSignatureFactoryXMLSignatureFactory是生成XML文档数字签名的工厂对象。对象的创建如下列代码所示:1XMLSignatureFactory factory = XMLSignatureFactory.getInstance(DOM);DOMSignContextDOMSignContext对象用来生成DOM树。在创建数字签名的过程中,DOM树会被附上XML数字签名。DOMSignContext对象要求输入私钥和XML文档的根元素。ReferenceReference对象用来在Signature 标记的SignedInfo内部创建XML数字签名。对象创建的遵循“W3C XML签名文法和处理”规则。Reference的基本结构如下:1234567 bHS+6uf8KbJV4AGzoHNHLfnXvKM=SignedInfo类似的,SignedInfo对象可以在数字签名的Signature标记内部创建元素。创建的规则同样遵循“W3C XML数字签名协议”。SignedInfo的基本结构如下:1234567891011 bHS+6uf8KbJV4AGzoHNHLfnXvKM= XMLSignature最后,XMLSignature对象用来创建XML文档的封面签名。按照W3C的建议,签名对象应该作为XML数字签名的根元素。完整的结构如下:1234567891011121314151617181920212223242526 bHS+6uf8KbJV4AGzoHNHLfnXvKM= aUEMrCT5dzeOfSNaznzoT0If8WZ8KQcMNXDqtoeseonVk3NqOk9ctcxrf3QVX3wP6810DDRPdI6l e8ccG64Ge0HjkO+aYC5+c2L/qKBzwtSbl/olJEuFU2DVxBQO+K29TTUJfxpVzC9Zf2pvT+1NRj0f 2/ofHujYZ01D6+YqI8c= jfAd5uV38L36+lDZJrqfH9oLN86VJezXYfAeU+lrFoHlKAXVJLAi9hKvBHQRer4tPfdez6iSBKsl 6IHkPnVRAKt0xU99uxi5QpymsWAX3qnBqHlw9Z70PwyZ+Xysfw4Q2tK2HtSgUOhMuaUcIf9sbHvf gbvcRPgxDZZqfIzDmDU= AQAB 为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论