XML数字签名Java

前端之家收集整理的这篇文章主要介绍了XML数字签名Java前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要在JAVA中对我的 XML消息进行数字签名:
生成的XML签名应具有以下格式:
  1. <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
  2. <SignedInfo>
  3. <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
  4. <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
  5. <Reference URI="">
  6. <Transforms>
  7. <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
  8. </Transforms>
  9. <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
  10. <DigestValue>DsP5NLca+plhp9tZvGwykfb2whQYt3CQ5sbsVd9Q9aE=</DigestValue>
  11. </Reference>
  12. </SignedInfo>
  13. <SignatureValue>
  14. LrfE0po3YPvVxB/m77iBWWiR07Ghiuhuj7tO2C2LKqZK2cLrAiidt+3tjbJ3m16quCFxfh7bmjRtJsGi7a3HKtK
  15. qY4auqrjNB62AtYrxvm+7Qd/cRacom4e3M9uF9JD1zTfoGun9w4WDfDrDaoZ+ZwUgNtf6sTYO5Ctcj5sYcD0=
  16. </SignatureValue>
  17. <KeyInfo>
  18. <KeyName>7D665C81ABBE1A7D0E525BFC171F04D276F07BF2</KeyName>
  19. </KeyInfo>
  20. </Signature>

任何人都可以提供一些代码帮助?

编辑:

我想出了这段代码

  1. private static Document sign(Document doc) throws InstantiationException,IllegalAccessException,ClassNotFoundException,NoSuchAlgorithmException,InvalidAlgorithmParameterException,KeyException,MarshalException,XMLSignatureException,FileNotFoundException,TransformerException {
  2.  
  3. String providerName = System.getProperty("jsr105Provider","org.jcp.xml.dsig.internal.dom.XMLDSigRI");
  4.  
  5. XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM",(Provider) Class.forName(providerName).newInstance());
  6.  
  7. Reference ref = fac.newReference("",fac.newDigestMethod(DigestMethod.SHA256,null));
  8.  
  9. // Create the SignedInfo
  10. SignedInfo si = fac.newSignedInfo(
  11. fac.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE,(C14NMethodParameterSpec) null),fac.newSignatureMethod(SignatureMethod.RSA_SHA1,null),Collections.singletonList(ref));
  12.  
  13. KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
  14. kpg.initialize(512);
  15. KeyPair kp = kpg.generateKeyPair();
  16.  
  17. KeyInfoFactory kif = fac.getKeyInfoFactory();
  18. KeyValue kv = kif.newKeyValue(kp.getPublic());
  19.  
  20. KeyInfo ki = kif.newKeyInfo(Collections.singletonList(kv));
  21.  
  22. DOMSignContext dsc = new DOMSignContext(kp.getPrivate(),doc.getDocumentElement());
  23.  
  24. XMLSignature signature = fac.newXMLSignature(si,ki);
  25. signature.sign(dsc);
  26.  
  27. TransformerFactory tf = TransformerFactory.newInstance();
  28. Transformer trans = tf.newTransformer();
  29. trans.transform(new DOMSource(doc),new StreamResult(new FileOutputStream("mySignedFile")));
  30.  
  31. return doc;
  32. }

但问题是我得到了:

  1. <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>

并不是 :

  1. <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
这是解决方案:

我在这个链接上找到它
http://mail-archives.apache.org/mod_mbox/santuario-dev/200907.mbox/%3C4A704241.9060806@sun.com%3E
问题是RSA-SHA256算法:

这是结果代码

  1. private static Document sign(Document doc) throws InstantiationException,(Provider) Class.forName(providerName).newInstance());
  2.  
  3. DigestMethod digestMethod = fac.newDigestMethod(DigestMethod.SHA256,null);
  4. Transform transform = fac.newTransform(ENVELOPED,(TransformParameterSpec) null);
  5. Reference reference = fac.newReference("",digestMethod,singletonList(transform),null,null);
  6. SignatureMethod signatureMethod = fac.newSignatureMethod("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256",null);
  7. CanonicalizationMethod canonicalizationMethod = fac.newCanonicalizationMethod(EXCLUSIVE,(C14NMethodParameterSpec) null);
  8.  
  9. // Create the SignedInfo
  10. SignedInfo si = fac.newSignedInfo(canonicalizationMethod,signatureMethod,singletonList(reference));
  11.  
  12.  
  13. KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
  14. kpg.initialize(2048);
  15.  
  16. KeyPair kp = kpg.generateKeyPair();
  17.  
  18. KeyInfoFactory kif = fac.getKeyInfoFactory();
  19. KeyValue kv = kif.newKeyValue(kp.getPublic());
  20.  
  21. // Create a KeyInfo and add the KeyValue to it
  22. KeyInfo ki = kif.newKeyInfo(Collections.singletonList(kv));
  23. DOMSignContext dsc = new DOMSignContext(kp.getPrivate(),ki);
  24. signature.sign(dsc);
  25.  
  26. TransformerFactory tf = TransformerFactory.newInstance();
  27. Transformer trans = tf.newTransformer();
  28.  
  29. // output the resulting document
  30. OutputStream os;
  31.  
  32. os = new FileOutputStream("xmlOut.xml");
  33.  
  34. trans.transform(new DOMSource(doc),new StreamResult(os));
  35. return doc;
  36.  
  37. }

猜你在找的XML相关文章