检查 XADES 符号的哈希值

Checking hash of XADES sign

Java 程序将 PDF 文档发送到外部系统并接收该文档的 XADES 标志。

我想检查 PDF 文档的散列是否与 Xades 标志中包含的散列相匹配。所以我计算了PDF文档的SHA1,但是和ds:DigestValue中的hash不同(fpm+e6K287hHh1xlYxXoZ3Q3bkQ=)。为什么?我确定我正在正确计算 PDF 文档哈希。

 <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>

谢谢

DigestValue不直接是文档的hash。它包含将哈希算法应用于 Reference 元素属性

中定义的已转换资源的 Base64 编码结果

查看此 post 了解更多详情

XAdES 建立在受 Java 标准支持的 XMLSignatures 之上。您可以使用标准验证器来验证基本数字签名。查看参考文档 http://www.oracle.com/technetwork/articles/javase/dig-signature-api-140772.html

遗憾的是,根据您的 XAdES 签名的特性,它并不总是可以通过 Java 标准进行验证。在这种情况下,我建议使用欧盟支持的开源项目 SD-DSS https://joinup.ec.europa.eu/asset/sd-dss/description