java - 检查 XADES 标志的哈希值

标签 java hash digital-signature

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

我想检查 PDF 文档的哈希值是否与 Xades 符号中包含的哈希值匹配。所以我计算了PDF文档的SHA1,但它与ds:DigestValue(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 并不直接是文档的哈希值。它包含将哈希算法应用于 Reference 元素属性

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

查看此帖子了解更多详细信息 https://stackoverflow.com/a/7589216/6371459

XAdES 基于 XMLSignatures 构建,受 Java 标准支持。您可以使用标准 validator 来验证基本数字签名。查看引用文档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

关于java - 检查 XADES 标志的哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38344500/

相关文章:

java - 在应用程序中添加签名栏

java - tinylog 的多个编写器

hash - 是否有任何常见的操作系统文件系统使用哈希来避免多次存储相同的内容数据?

ssl - 使用 openssl smime 进行数据验证失败

ruby - 将 Hash 转换为 XML,省略 XML header 声明

python - 使用通配符搜索迭代 Redis 哈希键

c# - 使用 iTextSharp 签署 PDF

java - 在 Java 中初始化最终变量的问题

Java 7 和反射 - 它会 self 优化吗?

java - Spring Security 自定义 RememberMeAuthenticationFilter 没有被解雇