【发布时间】:2020-05-24 15:40:39
【问题描述】:
我有一个网站,允许用户签署任何给定的上传文件。工作流程是:
- 用户上传文件。计算文件的 SHA256 摘要并将其存储在数据库中。
- 其他用户使用 RSA 对 SHA256 摘要进行签名。签名被添加到数据库中。
- 用户可以下载文件和签名(目前在单独的文件中)。签名文件是根据要求生成的。签名文件基本上是 HTML 文件,包含 Base64 和 QRCode 格式的校验和、签名和证书,可以打印以进行归档。
此外,该数据库还包含用户的公钥和证书(以及非技术用户的加密私钥,以便应用可以为他们处理整个签名签名过程)。
现在我想调整工作流程以对 PDF 文件提供特定支持,因为 PDF 文件具有对签名的特定支持。我在 PDFBox 上苦苦挣扎了几天,并成功单独签署了一个 PDF 文件,但我不知道如何适应我通常的工作流程。
PDFBox的签名用法目前是:
ExternalSigningSupport externalSigning =
document.saveIncrementalForExternalSigning(output);
byte[] cmsSignature = sign(externalSigning.getContent());
externalSigning.setSignature(cmsSignature);
然后将签名的 PDF 文件流式传输到 output。
摘要和签名的计算以及将签名和证书合并到 PDF 文件是在上面的“签名”方法中一步完成的,这意味着我不知道如何实现我通常的工作流程计算摘要(1)、签名(2)和生成签名文件(3)分三个步骤。此外,我假设externalSigning.getContent()给出的InputStream不包含整个PDF文件,这意味着无法使用我现有的代码检查摘要和签名?
【问题讨论】:
-
您不必因为 PDF 签名就使用它。您可以只使用自己的系统并像对待任何其他文件一样处理 pdf 文件。或者,如果您想保留 PDF 签名的一些好处,可以同时使用这两种方法。
-
如果您想通过多个步骤使用 pdfbox 创建集成的 pdf 签名,您可以从 eSignature DSS 的做法中获得启发。他们还坚持多步骤签名,甚至不想将准备好的 pdf 保留为临时数据,因此他们生成了两次相同的文件。
标签: java pdf rsa pdfbox digital-signature