检查 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
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
元素属性
查看此 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