Manuelle überprüfung der XML-Signatur

Kann ich erfolgreich manuell referenzbestätigung (kanonisieren jedes referenzierte element --> SHA1 --> Base64 --> überprüfen, ob es die gleiche von DigestValue Inhalt), aber ich scheitere mit der überprüfung der SignatureValue. Hier ist die SignedInfo zu kanonisieren und hash:

<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
 <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:CanonicalizationMethod>
 <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></ds:SignatureMethod>
 <ds:Reference URI="#element-1-1291739860070-11803898">
  <ds:Transforms>
   <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:Transform>
  </ds:Transforms>
  <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod>
  <ds:DigestValue>d2cIarD4atw3HFADamfO9YTKkKs=</ds:DigestValue>
 </ds:Reference>
 <ds:Reference URI="#timestamp">
  <ds:Transforms>
   <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:Transform>
  </ds:Transforms>
  <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod>
  <ds:DigestValue>YR/fZlwJdw+KbyP24UYiyDv8/Dc=</ds:DigestValue>
 </ds:Reference>
</ds:SignedInfo>

Ater entfernen Sie alle Leerzeichen zwischen den tags (und damit immer das gesamte element auf einer einzigen Zeile), habe ich dies erhalten sha1-digest (Base64):

6l26iBH7il/yrCQW6eEfv/VqAVo=

Nun erwarte ich zu finden, die den gleichen digest-nach der Entschlüsselung des SignatureValue Inhalt, aber ich bekomme eine differente und mehr Wert:

MCEwCQYFKw4DAhoFAAQU3M24VwKG02yUu6jleh+u6R4N8Ig=

Hier einige java-code für die decyption:

      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();    
  DocumentBuilder builder = dbf.newDocumentBuilder();  
  Document doc = builder.parse(new File(inputFilePath));
  NodeList nl = doc.getElementsByTagName("ds:SignatureValue");
  if (nl.getLength() == 0) {
     throw new Exception("Cannot find SignatureValue element");
   }
  String signature = "OZg96GMrGh0cEwbpHwv3KDhFtFcnzPxbwp9Xv0pgw8Mr9+NIjRlg/G1OyIZ3SdcOYqqzF4/TVLDi5VclwnjBAFl3SEdkyUbbjXVAGkSsxPQcC4un9UYcecESETlAgV8UrHV3zTrjAWQvDg/YBKveoH90FIhfAthslqeFu3h9U20=";
  X509Certificate cert = X509Certificate.getInstance(new FileInputStream(<a file path>));
  PublicKey pubkey = cert.getPublicKey();
  Cipher cipher = Cipher.getInstance("RSA","SunJCE");
  cipher.init(Cipher.DECRYPT_MODE, pubkey);
  byte[] decodedSignature = Base64Coder.decode(signature);
  cipher.update(decodedSignature);
  byte[] sha1 = cipher.doFinal();


  System.out.println(Base64Coder.encode(sha1));

Die Sache, die mich verwirrt viel ist, dass die zwei digests haben unterschiedliche Größe, aber natürlich habe ich auch erhalten müssen genau den gleichen Wert aus beiden Berechnungen angezeigt. Irgendwelche Vorschläge? Danke.

  • "Ater entfernen Sie alle Leerzeichen zwischen den tags"... ist das richtig? Suche auf w3.org/TR/2001/... es klingt wie Sie vielleicht zu entfernen zu viel whitespace.
  • Danke für die Antwort. Ich verstehe deinen Punkt, aber,wie gesagt, am Anfang die Frage, kann ich das erfolgreich tun referenzbestätigung (zwei Referenzen, es kann nicht sein, ein Unfall) die gleichen SOAP-Nachricht und nur durch entfernen die Leerzeichen, so muss ich davon ausgehen, dass es stimmt.
  • Die Heiligsprechung ist viel mehr als das entfernen von whitespace-Zeichen. Es behandelt das namespace-Präfix Fragen, Attributreihenfolge, und im Allgemeinen alles, das ändert die byte-Reihenfolge der phisicaly-Datei (und somit die hash-digest), ändert aber nicht die XML-infoset (== die Bedeutung, die Nutzdaten der XML)
  • Natürlich. Ich benutze org.apache.xml.Sicherheit.c14n.Canonicalizer aber nachdem ich müssen, entfernen Sie Leerzeichen, um die gleiche verdaut, von denen in der xml.
  • Ok habe ich gefunden, warum das digest der Entschlüsselung ist also groß: es besteht aus Präfix+tatsächliche digest (w3.org/TR/2002/REC-xmldsig-core-20020212/Overview.html). Aktuelle digest ist in den letzten 20 bytes. Jetzt habe ich zwei gleich große verdaut, aber immer noch unterschiedlich sind, hat jedes andere 🙁
InformationsquelleAutor Johnca | 2010-12-11
Schreibe einen Kommentar