当前位置: 首页 > 知识库问答 >
问题:

使用Itext验证Pdf签名时出现意外结果

翟凯
2023-03-14

我正在尝试用Itext 5.4和BouncyCastle 1.49验证PDF签名(它是通过Adobe Reader X用我的数字证书手动签名的)。

但是验证结果总是出乎意料的,下面是我的Java代码:

  **Security.addProvider(new BouncyCastleProvider());
  PdfReader reader = new PdfReader("E:/signTest.pdf");
  AcroFields acro = reader.getAcroFields();
  PdfPKCS7 pkcs7 = acro.verifySignature("signatureField");
  System.out.println("Integrity check OK? " + pkcs7.verify());**

控制台显示:完整性检查OK?真

共有1个答案

史朗
2023-03-14

“Integrity check OK”(作为PKCS7.Verify())的结果)只告诉您PDF的原始签名版本、原始签名字节范围未被更改。如果在追加模式下应用更改,也就是使用增量更新,则不会触及原始签名的字节范围。

如果要检查更改是否已作为增量更新进行,请同时检查acro.signaturecoverswholeDocument(“signaturefield”):

/**
 * Checks is the signature covers the entire document or just part of it.
 *
 * @param name the signature field name
 * @return <CODE>true</CODE> if the signature covers the entire document,
 * <CODE>false</CODE> otherwise
 */
public boolean signatureCoversWholeDocument(String name)

如果您确实更改了原来签名的字节范围,请在修改之前和修改之后提供您的PDF文件。

关于你的评论...

我遵循您建议,在检查Acro.SignatuRecoversWholeDocument(“SignatureField”)时得到“false”返回。那么是不是意味着“原来带符号的字节范围不被触及”呢?

您必须考虑这些结果值的组合:

如果前一个是true而后一个是false,则肯定地验证签名以签署文档的前一状态,该状态可以使用acro.extractrevision(“signaturefield”)从文档中提取。

与Adobe Reader相比,iText还不能检查内容的更改类型。因此,它不能告诉您这些更改是允许的还是不允许的。

如果前一个是假的,那么签名最初正确签名的状态(如果曾经有过这样的状态)就不能再提取了。

那么我如何应用签名来覆盖整个文档呢?

当您签署PDF时,签名覆盖整个文档。例如。示例文件signtest_after.pdf中的签名覆盖了整个文件。填充字段之后会在示例文件signtest_modified.pdf中添加一个新的版本,该版本不包含在您的签名中。

对于这方面的一些背景,您可能需要阅读以下答案以了解PDF签名的工作方式;阅读以下答案以了解PDF中的多个修订信息;阅读以下答案以了解对已签名文档的允许和不允许更改。

 类似资料:
  • 我正在尝试用Itext 5和BouncyCastle 1.48验证PDF签名。我的代码适用于许多已签名的pdf,但也适用于特定客户的某些pdf。这是我的Java代码 有时我会遇到这样的例外: JAVAlang.IllegalArgumentException:getInstance:org中的未知对象。蹦蹦跳跳。asn1。Asn1在组织中列举。蹦蹦跳跳。asn1。ASN1序列。组织上的getIns

  • 首先,虽然我关注StackOverflow已经有相当一段时间了,但这是我第一次发布一些东西,所以如果我做错了或者不按规则做的话,请随时为我指出正确的方向。 我正在开发一个PDF数字签名应用程序,使用iText5,它依赖于一个外部服务,在我准备好PDF签名后提供一个签名哈希。 如iText文档中所述,在第一阶段,我准备了PDF(在最终实现中,所有PDF都可能是多签名的,因此我使用追加模式),如下所示

  • 正如标题所说,我想知道给定的PDF文件是否已经过数字签名。 我用iText签署了它,但我不知道它是否已经签署,以最终辞职或采取其他行动。 有没有简单的方法(可能使用iText)?

  • 第一个选项是不可行的,因为PDF的签名没有时间戳(这是一个非常重要的必要条件),所以选择了第二个选项。 这是我们的代码,首先,我们得到签名外观,并计算散列: 在这一点上,我们有了文档的哈希代码。然后我们将散列发送到webservice,我们得到签名的散列代码。 按照mkl的建议,我遵循了这本书的4.3.3部分PDF文档的数字签名,现在我的代码如下: 第一部分,当我们计算散列时: 在第二部分,我们得

  • 我已经玩弄了一段时间的iTextSharp 5.5.7,找不到正确的方法从智能卡为PDF制作一个有效的数字签名-Adobe Reader总是说它的签名人和未知,并且不能解码签名的DER数据。 我查看了Makesignature.cs代码以供参考,以及is的功能: 然后,根据iExternalSignature.cs中的“Sign”方法 “@param message要进行散列和签名的邮件” 所以我