2016-07-13 17 views
0

Ein Java-Programm sendet ein PDF-Dokument an ein externes System und erhält ein XADES-Zeichen dieses Dokuments.Hash von XADES-Zeichen überprüfen

Ich möchte überprüfen, ob der Hash des PDF-Dokuments mit dem Hash innerhalb des Xades-Zeichens übereinstimmt. Also berechne ich den SHA1 des PDF-Dokuments, aber es ist anders als der Hash im ds: DigestValue (fpm + e6K287hHh1xlYxXoZ3Q3bkQ =). Warum? Ich bin mir sicher, dass ich den PDF-Dokument-Hash richtig berechne.

<documentoSGIFE> 
    <documentoOriginal Id="original" encoding="base64" nombreFichero="371F1EDC7D2D1B22E0500C0AD23624FD.PDF">...</documentoOriginal> 
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Signature001"> 
     <ds:SignedInfo Id="SignedInfo001"> 
     <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
     <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
     <ds:Reference Id="Reference001_001" URI="#original"> 
      <ds:Transforms> 
       <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
      </ds:Transforms> 
      <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
      <ds:DigestValue>fpm+e6K287hHh1xlYxXoZ3Q3bkQ=</ds:DigestValue> 
     </ds:Reference> 
     <ds:Reference Id="Reference001_002" Type="http://uri.etsi.org/01903/v1.2.2#SignedProperties" URI="#SignedProperties001">...</ds:Reference> 
     </ds:SignedInfo> 
     <ds:SignatureValue Id="SignatureValue001">...</ds:SignatureValue> 
     <ds:KeyInfo Id="KeyInfo001">...</ds:KeyInfo> 
     <ds:Object>...</ds:Object> 
    </ds:Signature> 
</documentoSGIFE> 

Dank

Antwort

1

DigestValue ist nicht direkt die Hash des Dokuments. Es enthält die Base64 codierte Ergebnis der Hash-Algorithmus auf die transformierte Ressource Anwendung (en), definiert in dem Reference Element

Prüfen Dieser Beitrag für mehr Details Eigenschaften https://stackoverflow.com/a/7589216/6371459

XAdES auf XMLSignatures aufgebaut ist, die von Java unterstützt werden, Standard. Sie können den Standardvalidator verwenden, um die digitale Basissignatur zu überprüfen. Überprüfen Sie die Referenzdokumentation http://www.oracle.com/technetwork/articles/javase/dig-signature-api-140772.html

Leider, abhängig von den Eigenschaften Ihrer XAdES-Signatur, kann es nicht immer durch Java-Standard verifiziert werden. In diesem Fall schlage ich vor, das von der Europäischen Union unterstützte Open-Source-Projekt SD-DSS unter https://joinup.ec.europa.eu/asset/sd-dss/description

+0

zu verwenden. Vielen Dank für Ihre Hilfe. Wenn ich nicht falsch verstehe, muss ich zuerst die Transformation "http://www.w3.org/2000/09/xmldsig#enveloped-signature" auf die Daten im "documentoOriginal" -Element anwenden. Berechnen Sie dann den SHA1-Hash und berechnen Sie dann die Base64-Zeichenfolge. Ich weiß, wie man die SHA1 und die Base64 berechnet, aber ich weiß nicht, wie man die Transformation "http://www.w3.org/2000/09/xmldsig#enveloped-signature" anwendet. Kannst du mir helfen? – Eduardo

+0

Warum validieren Sie die vollständige Signatur nicht? Wenn Sie nur den Hash überprüfen, wird die Integrität nicht überprüft. Wahrscheinlich wäre der Code einfacher. Ich bin mir nicht sicher, aber um den 'digestValue' zu ​​berechnen, kann man' XMLSignatureFactory.newRef' und 'XMLSignatureFactory.newSignedInfo' wie im Code Sample 1 des angegebenen Links gezeigt verwenden. Wenn es digestValue nicht direkt bereitstellt, führen Sie die Signatur mit einem automatisch generierten Keystore aus. Die Signatur wird anders sein, aber der Hash wird gleich sein. – pedrofb

+0

Ich validiere die vollständige Signatur mit "@firma" (spanische Staatslösung für die Validierung von Zeichen). Aber "@firma" überprüft nicht, ob das Zeichen dem Originaldokument entspricht. Ich werde versuchen, was Sie mir vorschlagen. Danke – Eduardo