gpt4 book ai didi

pdf - 无法使用Apache PDFBOX验证数字签名

转载 作者:行者123 更新时间:2023-12-04 17:00:06 30 4
gpt4 key购买 nike

我是使用数字签名的新手。在其中一个项目中,我们使用Apache PdfBox处理数字签名的pdf文件。虽然我们可以测试所有功能,但是我们无法破解对签名的pdf文件的验证。我们正在使用BouncyCaSTLe作为提供程序。下面是代码:

//从pdf文件获取数字签名和签名内容

byte[] signatureAsBytes = pdsignature.getContents(new FileInputStream(this.INPUT_FILE));
byte[] signedContentAsBytes = pdsignature.getSignedContent(new FileInputStream(this.INPUT_FILE));

//数字签名验证
Security.addProvider(new BouncyCastleProvider());
Signature signer = Signature.getInstance("RSA","BC");

//Get PublicKey from p7b file
X509Certificate cert509=null;
File file = new File("C:\\certificate_file.p7b");
FileInputStream fis = new FileInputStream(file);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Collection c = cf.generateCertificates(fis);
Iterator it = c.iterator();
PublicKey pubkey;

while (it.hasNext())
{
cert509 = (X509Certificate) it.next();
pubkey = cert509.getPublicKey();
}

boolean VERIFIED=false;
Security.addProvider(new BouncyCastleProvider());
Signature signer = Signature.getInstance("RSA","BC");
PublicKey key=this.getPublicKey(false);
signer.initVerify(key);

List<PDSignature> allsigs = this.PDFDOC.getSignatureDictionaries();
Iterator<PDSignature> i = allsigs.iterator();

while(i.hasNext())
{
PDSignature sig = (PDSignature) i.next();
byte[] signatureAsBytes = sig.getContents(new FileInputStream(this.INPUT_FILE));
byte[] signedContentAsBytes = sig.getSignedContent(new FileInputStream(this.INPUT_FILE));
signer.update(signedContentAsBytes);
VERIFIED=signer.verify(signatureAsBytes);
}

System.out.println("Verified="+VERIFIED);

以下是p7b格式的证书的相关摘录-我正在使用BouncyCaSTLe作为安全提供程序:
  Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11
Key: Sun RSA public key, 2048 bits
Validity: [From: Tue Aug 06 12:26:47 IST 2013,
To: Wed Aug 05 12:26:47 IST 2015]
Algorithm: [SHA256withRSA]

使用上面的代码,我总是得到响应为“false”。我不知道如何解决此问题。请帮忙

最佳答案

您的主要问题是,有多种类型的PDF签名,其签名容器的格式以及签名字节的实际含义是不同的。另一方面,您的BC代码只能验证包含在上述签名容器中的裸签名字节序​​列。

可互操作的签名类型

正如标题已经说过的那样,以下列表包含或多或少严格定义的“可互操作的签名类型”。 PDF specification指定一种还包括完全自定义签名方案的方法。但是,让我们假设我们处于一种可互操作的情况。签名类型的集合可归结为:

ISO 32000-1第12.8.3.2节PKCS#1签名中定义的

  • adbe.x509.rsa_sha1 ;签名值内容包含一个DER编码的PKCS#1二进制数据对象;如果是RSA,则此数据对象是完全裸露的签名,其中包含填充的文档哈希和哈希算法的加密结构。
  • ISO 32000-1第12.8.3.3节PKCS#7签名中定义的
  • adbe.pkcs7.sha1 ;签名值内容包含一个DER编码的PKCS#7二进制数据对象;这个数据对象是一个大容器对象,它也可以包含元信息。它可能包含用于构建证书链的证书,用于证书吊销检查的吊销信息,用于固定签名时间的数字时间戳等...文档字节范围的SHA1摘要应封装在PKCS#7 SignedData字段中,其ContentInfo类型为数据。该SignedData的摘要应作为常规PKCS#7摘要合并。
  • ISO 32000-1第12.8.3.3节PKCS#7签名中定义的
  • adbe.pkcs7.detached ;签名值内容包含一个DER编码的PKCS#7二进制数据对象,请参见上文。文档字节范围内的原始签名消息摘要应合并为常规PKCS#7 SignedData字段。 PKCS#7 SignedData字段中不得封装任何数据。
  • ETSI TS 102 778-3中定义的ETSI.CAdES.detached ,并将集成到ISO 32000-2中;签名值内容包含CMS中指定的DER编码的SignedData对象; CMS签名容器与PKCS#7签名容器是近亲,请参见上文。从本质上讲,这是adbe.pkcs7.detached的不同轮廓且更严格定义的变体。
  • ETSI TS 102 778-4中定义的ETSI.RFC3161 ETSI.RFC3161 ,将集成到ISO 32000-2中;签名值 内容包含一个RFC 3161中指定的TimeStampToken;时间戳记 token 再次与PKCS#7签名容器紧密相关,请参见上文,但是它们包含一个特殊的数据子结构,其中包含文档哈希,戳记创建的时间以及发布时间服务器上的信息。
    我建议研究我命名的规范以及从中引用的文档,主要是RFC。基于这些知识,您可以轻松找到合适的BouncyCaSTLe类来分析不同的签名 内容

    关于pdf - 无法使用Apache PDFBOX验证数字签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25957573/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com