2015-07-29 1 views
0

Je dois créer une valeur digest pour l'entrée ci-dessousXML Digitial Sécurité - Hmac_SHA1

<u:Timestamp u:Id="_0" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <u:Created>2015-07-28T13:35:54Z</u:Created> 
    <u:Expires>2015-07-28T13:40:49Z</u:Expires> 
</u:Timestamp> 

si je passe la valeur ci-dessus comme doc obj au code ci-dessous

public static void main(String[] args) throws Exception { 

    // Create a DOM XMLSignatureFactory that will be used to generate the 
    // enveloped signature 
    XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM"); 
    SecretKey signingKey = new SecretKeySpec("welcome1".getBytes(), "HMAC"); 
    // Create a Reference to the enveloped document (in this case we are 
    // signing the whole document, so a URI of "" signifies that) and 
    // also specify the SHA1 digest algorithm and the ENVELOPED Transform. 

    Reference ref = fac.newReference 
     ("#_0", fac.newDigestMethod(DigestMethod.SHA1, null), 
     Collections.singletonList 
      (fac.newTransform 
      ("http://www.w3.org/2001/10/xml-exc-c14n#", (TransformParameterSpec) null)), 
     null, null); 

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


    // Instantiate the document to be signed 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    dbf.setNamespaceAware(true); 
    Document doc = 
     dbf.newDocumentBuilder().parse(new FileInputStream("C:/Users/Signed_Encryp/timestamp.txt")); 

    // Create a DOMSignContext and specify the DSA PrivateKey and 
    // location of the resulting XMLSignature's parent element 
    DOMSignContext dsc = new DOMSignContext 
     (signingKey, doc.getDocumentElement()); 

    // Create the XMLSignature (but don't sign it yet) 
    XMLSignature signature = fac.newXMLSignature(si, null); 

    // Marshal, generate (and sign) the enveloped signature 
    signature.sign(dsc); 

    // output the resulting document 
    OutputStream os; 
    if (args.length > 1) { 
     os = new FileOutputStream(args[1]); 
    } else { 
     os = System.out; 
    } 

    TransformerFactory tf = TransformerFactory.newInstance(); 
    Transformer trans = tf.newTransformer(); 
    trans.transform(new DOMSource(doc), new StreamResult(os)); 
} 

qui me retourner un résultat aussi

<u:Timestamp xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" u:Id="_0"> 
    <u:Created>2015-07-28T13:35:54Z</u:Created> 
    <u:Expires>2015-07-28T13:40:49Z</u:Expires> 
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
     <ds:SignedInfo> 
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
      <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1"/> 
      <ds:Reference URI="#_0"> 
       <ds:Transforms> 
        <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
       </ds:Transforms> 
       <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
       <ds:DigestValue>1X/3X+yCdJc0x3n8guQnlCFvX+s=</ds:DigestValue> 
      </ds:Reference> 
     </ds:SignedInfo> 
     <ds:SignatureValue>R4ZrHvlvyGvvQYpojZWPgUgRRSw=</ds:SignatureValue> 
    </ds:Signature> 
</u:Timestamp> 

ici ne suis pas convaincu que la valeur digest est créée en utilisant l'entrée je suis passé, aussi SIGNATUR e est créé à l'intérieur de la balise timestamp, y at-il une option disponible pour créer une balise de signature après la balise timestamp.

S'il vous plaît aider

Répondre

0

Pour vérifier si la signature est sur les données, modifiez simplement les données et utiliser la même clé. Si la valeur HMAC change alors le hachage est clairement sur les données. En revenant, il devrait revenir à l'ancienne valeur. Noter que ceci est vrai pour HMAC-SHA1, il peut et non être le cas pour toutes les primitives (par exemple RSA-PSS). Alternativement, si vous êtes à la hauteur, vous pouvez effectuer la canonisation vous-même et calculer manuellement la signature. Ou essayez une autre implémentation.


Si u:Timestamp est l'élément racine, alors vous ne pouvez pas mettre quoi que ce soit à côté, comme XML ne comporte qu'un seul élément racine. Vous avez vous-même indiqué que la signature est placée au doc.getDocumentElement(). Vous pouvez cependant créer une signature détachée. Maintenant, vous savez comment il s'appelle, vous devriez être capable de le chercher.

+0

Quelque chose manque dans ma réponse? –