我正在为pdf文件签名,我得到了一些关注。从pdfbox的例子,我看到了2种方法来做签名pdf。第一个问题是:
document.saveIncremental(output);
第二种方法是:
ExternalSigningSupport externalSigning = doc.saveIncrementalForExternalSigning(fos);
// invoke external signature service
byte[] cmsSignature = sign(externalSigning.getContent());
if (isLateExternalSigning()) {
// this saves the file with a 0 signature
externalSigning.setSignature(new byte[0]);
// remember the offset (add 1 because of "<")
int offset = signature.getByteRange()[1] + 1;
// now write the signature at the correct offset without any PDFBox methods
RandomAccessFile raf = new RandomAccessFile(signedFile, "rw");
raf.seek(offset);
raf.write(Hex.getBytes(cmsSignature));
raf.close();
} else {
// set signature bytes received from the service and save the file
externalSigning.setSignature(cmsSignature);
}
saveIncremental
和saveIncrementalForExternalSigning
有什么区别?我是说这些方法的用例。
每种方法的目的是什么?
什么是“增量”?
什么是“外部签名”?像政府这样的第三方吗?
发布于 2020-12-23 11:01:37
什么是“增量”?
当将更改保存到pdf时,一个有两个选择,一个可以保存一个全新的pdf文件,或者可以将更改附加到原始文件的副本中。后一种技术称为增量更新。
再次签署已签名的pdf时,必须将此新签名的新增内容作为增量更新应用,以防止现有签名无效:
(有关背景和参考资料,请参见this answer。)
因此,pdf库也需要在增量更新中支持签名pdf。
为了保持简单,PDFBox只支持在增量更新中签名PDF,因此已经以这种方式添加了第一个签名。
saveIncremental
和saveIncrementalForExternalSigning
有什么区别?
saveIncremental
使用saveIncremental
创建一个签名的pdf使用回调来生成签名容器:您在PDDocument.addSignature
调用中选择的SignatureInterface
实现的方法sign
被saveIncremental
用于检索签名容器,以便文档字节签名。
在pdfbox签名示例中,sign
方法在CreateSignatureBase
中实现,并在signPDF
中设置为签名接口。
saveIncrementalForExternalSigning
使用saveIncrementalForExternalSigning
创建一个签名的pdf不需要SignatureInterface
实现。相反,它返回一个ExternalSigningSupport
对象,您可以从该对象检索要签名的数据(getContent
),然后您可以为该对象创建一个签名容器,您最终可以使用另一个ExternalSigningSupport
方法(setSignature
)将其插入到pdf中。
到目前为止,这听起来只是一个支持不同编程模式首选项的选项,回调和非回调是顺序的。
不过,这里还有一个额外的选项,也称为延迟签名:您可以插入一个虚拟签名容器,而不是注入一个实际的签名容器:
externalSigning.setSignature(new byte[0]);
并检索签名容器的占位符(十六进制编码)所在的位置:
int offset = signature.getByteRange()[1] + 1;
因此,现在您可以计算哈希来签名,存储文件和偏移量,例如在数据库中,并调用一些签名服务,而不必在内存中保存pdf。
最后,您可以注入签名容器,如示例代码中所示:
RandomAccessFile raf = new RandomAccessFile(signedFile, "rw");
raf.seek(offset);
raf.write(Hex.getBytes(cmsSignature));
raf.close();
这些方法的用例
如前所述,乍一看,这两种方法只支持不同的编程模式、回调和顺序。
虽然额外的选项确实允许支持其他用例,但在某些情况下特别方便:
如果签名服务速度慢,则
。
什么是“外部签名”?像政府这样的第三方吗?
这里的“外部”是指程序的执行。虽然回调感觉非常内部,但按顺序顺序分离调用的感觉不那么明显,延迟签名可以被看作是真正的外部签名。
第三方签名服务(不管是政府还是非政府服务)都可以集成到任何一个体系结构中。视它们的性能而定,推迟的办法可能更可取。
https://stackoverflow.com/questions/65370941
复制相似问题