【问题标题】:Obtaining the hash/digest from a PCKS7 signed PDF file with iText使用 iText 从 PCKS7 签名的 PDF 文件中获取哈希/摘要
【发布时间】:2023-03-12 20:37:01
【问题描述】:

我正在编写一个 Java Web 服务,它使用来自网络中某些客户端的 iText 对 PDF 文档进行签名。文档已正确签名,并且可以使用外部工具进行验证。但是,由于一些法律限制,为了将此文档存储在官方文档存储库中,我必须提供签名中的哈希/摘要消息。

我几乎尝试了任何方法来获取该哈希,但我能得到的最接近的方法是使用此代码 sn-p 获取整个签名 (CERT+HASH/DIGEST+TIMESTAMP) 作为字符串(请原谅字符串和[1] 因为我只是在测试如何做):

    PdfReader reader = new PdfReader(path);
    File temp = TempFileManager.createTempFile("aasd2sd", "asdasda222cff");
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(temp));
    stamper.setRotateContents(false);
    PdfString firma = (PdfString) stamper.getAcroFields().getSignatureDictionary("Signature1").get((PdfName)stamper.getAcroFields().getSignatureDictionary("Signature1").getKeys().toArray()[1]);

据我所知,我得到了一个 DER 编码的 PKCS7 签名。但是,我不知道如何解码/读取这些信息以达到紧急状态。

有什么想法吗?

谢谢, 危机。

【问题讨论】:

  • 我的建议:谷歌“解码 pkcs7 java”
  • @Egl 感谢您的帮助,但我仍然遇到问题。通过谷歌搜索您的建议,我得到了与 [link]bouncycastle.org/docs/pkixdocs1.4/org/bouncycastle/cms/… 类似的代码。但是,当尝试使用我的文件初始化 CMSSignedData 时,我得到一个 org.bouncycastle.cms.CMSException: IOException reading content。

标签: java pdf itext pkcs#7


【解决方案1】:

首先,签名不一定有 散列/摘要消息,在 PKCS#7 / CMS 签名的情况下,通常涉及多个散列,cf . this answer to Message digest of pdf in digital signature.

考虑到您需要摘要来满足一些法律限制,不过,我假设您在 ETSI 的签名属性MessageDigest 的值之后(如果存在) .CAdES.detachedadbe.pkcs7.detached 类型的 PDF 签名是签名字节范围的摘要。


如果您想使用 iText 类(即 not 安全提供程序类)来做到这一点,您必须克服您所追求的值存储在私有成员中的小问题 (PdfPKCS7.digestAttr )。不过,一些反射允许您访问它:

void extractHashes(PdfReader reader) throws Exception
{
    AcroFields acroFields = reader.getAcroFields();
    List<String> names = acroFields.getSignatureNames();

    for (String name: names)
    {
        PdfPKCS7 pdfPkcs7 = acroFields.verifySignature(name);
        pdfPkcs7.verify();

        Field digestAttrField = PdfPKCS7.class.getDeclaredField("digestAttr");
        digestAttrField.setAccessible(true);
        byte[] digestAttr = (byte[]) digestAttrField.get(pdfPkcs7);

        // process the digest value in digestAttr 
    }
}

您可以在更完整的示例ExtractHash.java中找到使用的方法,它输出PDF文档中签名字段的gigest算法和摘要值,例如:

FirstPage11P0022AD_20150202164018_307494.pdf
  Signature1
    Digest algorithm: SHA1
    Hash: 4ac0ed7c2ec611d491f37b5ca74598237b85dbab

【讨论】:

  • 你是一个节省者,谢谢。我知道我不应该提取摘要,但我必须继续遵守这些限制,尽管我讨厌它们。
  • 我知道我不应该提取摘要 - 这本身并不是一件坏事。我真的想知道为什么 iText 类会隐藏这些信息。
  • 购买方式,如果您认为答案是正确的,您可能希望通过单击左侧的勾号来接受它。
  • 完成!抱歉,对使用 stackoverflow 太陌生了!再次感谢!
猜你喜欢
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
相关资源
最近更新 更多