JAXB Marshalling with xmldsig Signature

前端 未结 1 990
闹比i
闹比i 2020-12-30 12:34

Is it possible to create jaxb marshaller which automatically adds digital signature to xml content.

For example if I have a class which is defined:

         


        
相关标签:
1条回答
  • 2020-12-30 13:20

    You will need to use JAXB to marshal your domain model to a DOM Document and then apply the signature to that using an approach like the following:

    import java.security.*;
    import java.util.Collections;
    import javax.xml.bind.*;
    import javax.xml.crypto.XMLStructure;
    import javax.xml.crypto.dsig.*;
    import javax.xml.crypto.dsig.dom.DOMSignContext;
    import javax.xml.crypto.dsig.keyinfo.*;
    import javax.xml.transform.*;
    import javax.xml.transform.dom.*;
    import javax.xml.transform.stream.StreamResult;
    import org.w3c.dom.Document;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance(Test.class);
    
            Test test = new Test();
            test.setInfo("value");
    
            Marshaller marshaller = jc.createMarshaller();
            DOMResult domResult = new DOMResult();
            marshaller.marshal(test, domResult);
    
            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.SHA1, null), Collections.singletonList(fac
                    .newTransform(Transform.ENVELOPED, (XMLStructure) null)), null,
                    null);
    
            SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(
                    CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS, (XMLStructure) null), fac
                    .newSignatureMethod(SignatureMethod.DSA_SHA1, null),
                    Collections.singletonList(ref));
    
            KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA");
            kpg.initialize(512);
            KeyPair kp = kpg.generateKeyPair();
    
            KeyInfoFactory kif = fac.getKeyInfoFactory();
            KeyValue kv = kif.newKeyValue(kp.getPublic());
    
            KeyInfo ki = kif.newKeyInfo(Collections.singletonList(kv));
    
            Document doc = (Document) domResult.getNode();
    
            DOMSignContext dsc = new DOMSignContext(kp.getPrivate(),
                    doc.getDocumentElement());
    
            XMLSignature signature = fac.newXMLSignature(si, ki);
            signature.sign(dsc);
    
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer t = tf.newTransformer();
            DOMSource source = new DOMSource(domResult.getNode());
            StreamResult result = new StreamResult(System.out);
            t.transform(source, result);
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题