2012-09-21 16 views
8

मैं डिजिटल करने की जरूरत है जावा में मेरे एक्सएमएल संदेशों पर हस्ताक्षर: जिसके परिणामस्वरूप एक्सएमएल हस्ताक्षर निम्न स्वरूप होना चाहिए:एक्सएमएल डिजिटल हस्ताक्षर जावा

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
<SignedInfo> 
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /> 
<Reference URI=""> 
<Transforms> 
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
</Transforms> 
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> 
<DigestValue>DsP5NLca+plhp9tZvGwykfb2whQYt3CQ5sbsVd9Q9aE=</DigestValue> 
</Reference> 
</SignedInfo> 
<SignatureValue> 
LrfE0po3YPvVxB/m77iBWWiR07Ghiuhuj7tO2C2LKqZK2cLrAiidt+3tjbJ3m16quCFxfh7bmjRtJsGi7a3HKtK 
qY4auqrjNB62AtYrxvm+7Qd/cRacom4e3M9uF9JD1zTfoGun9w4WDfDrDaoZ+ZwUgNtf6sTYO5Ctcj5sYcD0= 
</SignatureValue> 
<KeyInfo> 
<KeyName>7D665C81ABBE1A7D0E525BFC171F04D276F07BF2</KeyName> 
</KeyInfo> 
</Signature> 

किसी को भी कोड के साथ कुछ मदद प्रदान कर सकते हैं ??

संपादित करें:

private static Document sign(Document doc) throws InstantiationException, IllegalAccessException, ClassNotFoundException, 
      NoSuchAlgorithmException, InvalidAlgorithmParameterException, KeyException, MarshalException, XMLSignatureException, 
      FileNotFoundException, TransformerException { 

     String providerName = System.getProperty("jsr105Provider", "org.jcp.xml.dsig.internal.dom.XMLDSigRI"); 

     XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance()); 

     Reference ref = fac.newReference("", fac.newDigestMethod(DigestMethod.SHA256, null)); 

     // Create the SignedInfo 
     SignedInfo si = fac.newSignedInfo(
       fac.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE, (C14NMethodParameterSpec) null), 
       fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(ref)); 

     KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
     kpg.initialize(512); 
     KeyPair kp = kpg.generateKeyPair(); 

     KeyInfoFactory kif = fac.getKeyInfoFactory(); 
     KeyValue kv = kif.newKeyValue(kp.getPublic()); 

     KeyInfo ki = kif.newKeyInfo(Collections.singletonList(kv)); 

     DOMSignContext dsc = new DOMSignContext(kp.getPrivate(), doc.getDocumentElement()); 

     XMLSignature signature = fac.newXMLSignature(si, ki); 
     signature.sign(dsc); 

     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer trans = tf.newTransformer(); 
     trans.transform(new DOMSource(doc), new StreamResult(new FileOutputStream("mySignedFile"))); 

     return doc; 
    } 

लेकिन समस्या मैं हो रही है::

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

और नहीं:

<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /> 

उत्तर

5

यहाँ समाधान है:

मैं इस लिंक http://mail-archives.apache.org/mod_mbox/santuario-dev/200907.mbox/%[email protected]%3E समस्या थी आरएसए-SHA256 एल्गोरिथ्म पर ढूंढ:

यहाँ

जिसके परिणामस्वरूप कोड है:

private static Document sign(Document doc) throws InstantiationException, IllegalAccessException, ClassNotFoundException, 
      NoSuchAlgorithmException, InvalidAlgorithmParameterException, KeyException, MarshalException, XMLSignatureException, 
      FileNotFoundException, TransformerException { 

     String providerName = System.getProperty("jsr105Provider", "org.jcp.xml.dsig.internal.dom.XMLDSigRI"); 

     XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance()); 

     DigestMethod digestMethod = fac.newDigestMethod(DigestMethod.SHA256, null); 
     Transform transform = fac.newTransform(ENVELOPED, (TransformParameterSpec) null); 
     Reference reference = fac.newReference("", digestMethod, singletonList(transform), null, null); 
     SignatureMethod signatureMethod = fac.newSignatureMethod("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256", null); 
     CanonicalizationMethod canonicalizationMethod = fac.newCanonicalizationMethod(EXCLUSIVE, (C14NMethodParameterSpec) null); 

     // Create the SignedInfo 
     SignedInfo si = fac.newSignedInfo(canonicalizationMethod, signatureMethod, singletonList(reference)); 


     KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
     kpg.initialize(2048); 

     KeyPair kp = kpg.generateKeyPair(); 

     KeyInfoFactory kif = fac.getKeyInfoFactory(); 
     KeyValue kv = kif.newKeyValue(kp.getPublic()); 

     // Create a KeyInfo and add the KeyValue to it 
     KeyInfo ki = kif.newKeyInfo(Collections.singletonList(kv)); 
     DOMSignContext dsc = new DOMSignContext(kp.getPrivate(), doc.getDocumentElement()); 

     XMLSignature signature = fac.newXMLSignature(si, ki); 
     signature.sign(dsc); 

     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer trans = tf.newTransformer(); 

     // output the resulting document 
     OutputStream os; 

     os = new FileOutputStream("xmlOut.xml"); 

     trans.transform(new DOMSource(doc), new StreamResult(os)); 
     return doc; 

    } 
0

ये

मैं इस कोड के साथ आया था मानक एक्सएमएल हैं -हस्ताक्षर। विनिर्देश के लिए W3 Documentation on "XML-Signature Syntax and Processing" देखें कि यह कैसे किया जा सकता है। जावा में एक्सएमएल हस्ताक्षर के एकीकरण पर ओरेकल द्वारा लिखे गए इस बारे में Google लीड पर एक त्वरित खोज: XML Digital Signature API। यदि आपको कोई और समस्या है, तो कृपया हमें दिखाएं कि आपने क्या प्रयास किया है।

+0

अब मुझे rsa-sha256 :(के साथ कोई समस्या है – kozla13

2

आप <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> मिला , क्योंकि आपने यही पूछा: fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null)। जैसा कि आपने अनुमान लगाया है और https://blogs.oracle.com/mullan/entry/using_stronger_xml_signature_algorithms राज्य, fac.newSignatureMethod("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256", (SignatureMethodParameterSpec) null) आपको <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /> प्राप्त करेंगे।

संबंधित मुद्दे