gpt4 book ai didi

java - 使用摘要异步签署 pdf

转载 作者:行者123 更新时间:2023-11-30 02:21:32 27 4
gpt4 key购买 nike

我正在尝试执行以下设置来签名 pdf,分为客户端和服务器之间的异步步骤:

  1. 服务器接收 PDF 并计算其摘要。
  2. 服务器将摘要发送给客户端。
  3. 客户端稍后对哈希进行签名。
  4. 客户端将签名发送到服务器。
  5. 服务器将签名嵌入到 pdf 中。

我主要基于PDF Signature digestCreate pkcs7 signature from file digest

第二个问题允许我编写大部分代码,但是我发现文件的完整性已受到损害。我似乎无法序列化中间 pdf 以稍后嵌入签名(以确保没有时间戳被更改等)。但从第一个问题来看,这似乎是一个比我想象的更难的问题。真的可以做到吗?

我正在使用 pdfbox。

服务器代码:

        PDDocument document = PDDocument.load(documentFile);
PDSignature signature = new PDSignature();
signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
signature.setName("Example User");
signature.setLocation("Los Angeles, CA");
signature.setReason("Testing");
Calendar date = Calendar.getInstance();
signature.setSignDate(date);
document.addSignature(signature);

ExternalSigningSupport externalSigningSupport = document.saveIncrementalForExternalSigning(null);

byte[] content = IOUtils.toByteArray(externalSigningSupport.getContent());
MessageDigest md = MessageDigest.getInstance("SHA256", new BouncyCastleProvider());
byte[] digest = md.digest(content); // this is sent to client

我基本上所做的是将摘要发送给客户端进行签名,然后在服务器上重做上述步骤并设置客户端签名:

        ExternalSigningSupport externalSigning = document.saveIncrementalForExternalSigning(fos);
externalSigning.setSignature(encodedSignature); // encodedSignature is received from client and computed based on the digest sent by the server

这种设置最终导致文件的完整性被破坏,因为一旦我在服务器上拥有了 encodedSignature 来嵌入它,我就会创建一个新的 PDSignature。有没有办法序列化调用 addSignature 后创建的 PDDocument,以便我稍后可以在服务器上反序列化它并添加客户端的签名?

最佳答案

What I'm basically doing is sending that digest to the client to sign and then on the server redoing the above steps and setting the client signature

如果您希望上述步骤生成相同的文档,您需要

  • 确保这些步骤的输入相同,并且
  • 提供相同的修订 ID 种子值。

如果您这样做,上述步骤的输出将与您的任务所需的相同。

确保输入相同

上述步骤中的一个步骤可能会导致不同的输入:

Calendar date = Calendar.getInstance();
signature.setSignDate(date);

为了保证相同的输入,您只需确定一次日期,并在每次为同一签名交易执行这些步骤时使用该单个值。

提供相同的修订 ID 种子值

根据规范的建议,PDFBox 尝试为每个 PDF 修订版提供唯一的 ID。不过,在当前的情况下,我们在执行上述步骤两次时都需要相同的修订 ID。

幸运的是,PDFBox 允许我们提供它用来使修订 ID 足够唯一的种子值。

由于我们不希望在同一文档上始终使用相同的修订 ID,而只是在当前签名交易期间使用,因此我们应该仅在同一交易中使用相同的种子值。由于种子值很长,我们可以简单地使用与上面已经讨论过的日期相对应的时间(以毫秒为单位),即:

pdDocument.setDocumentId(date.getTimeInMillis());

关于java - 使用摘要异步签署 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46689478/

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