首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pdfbox签名- saveIncremental vs saveIncrementalForExternalSigning

Pdfbox签名- saveIncremental vs saveIncrementalForExternalSigning
EN

Stack Overflow用户
提问于 2020-12-19 14:40:46
回答 1查看 833关注 0票数 5

我正在为pdf文件签名,我得到了一些关注。从pdfbox的例子,我看到了2种方法来做签名pdf。第一个问题是:

代码语言:javascript
运行
复制
document.saveIncremental(output);

第二种方法是:

代码语言:javascript
运行
复制
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);
}

saveIncrementalsaveIncrementalForExternalSigning有什么区别?我是说这些方法的用例。

每种方法的目的是什么?

什么是“增量”?

什么是“外部签名”?像政府这样的第三方吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-23 11:01:37

什么是“增量”?

当将更改保存到pdf时,一个有两个选择,一个可以保存一个全新的pdf文件,或者可以将更改附加到原始文件的副本中。后一种技术称为增量更新。

再次签署已签名的pdf时,必须将此新签名的新增内容作为增量更新应用,以防止现有签名无效:

(有关背景和参考资料,请参见this answer。)

因此,pdf库也需要在增量更新中支持签名pdf。

为了保持简单,PDFBox只支持在增量更新中签名PDF,因此已经以这种方式添加了第一个签名。

saveIncrementalsaveIncrementalForExternalSigning有什么区别?

saveIncremental

使用saveIncremental创建一个签名的pdf使用回调来生成签名容器:您在PDDocument.addSignature调用中选择的SignatureInterface实现的方法signsaveIncremental用于检索签名容器,以便文档字节签名。

在pdfbox签名示例中,sign方法在CreateSignatureBase中实现,并在signPDF中设置为签名接口。

saveIncrementalForExternalSigning

使用saveIncrementalForExternalSigning创建一个签名的pdf不需要SignatureInterface实现。相反,它返回一个ExternalSigningSupport对象,您可以从该对象检索要签名的数据(getContent),然后您可以为该对象创建一个签名容器,您最终可以使用另一个ExternalSigningSupport方法(setSignature)将其插入到pdf中。

到目前为止,这听起来只是一个支持不同编程模式首选项的选项,回调和非回调是顺序的。

不过,这里还有一个额外的选项,也称为延迟签名:您可以插入一个虚拟签名容器,而不是注入一个实际的签名容器:

代码语言:javascript
运行
复制
externalSigning.setSignature(new byte[0]);

并检索签名容器的占位符(十六进制编码)所在的位置:

代码语言:javascript
运行
复制
int offset = signature.getByteRange()[1] + 1;

因此,现在您可以计算哈希来签名,存储文件和偏移量,例如在数据库中,并调用一些签名服务,而不必在内存中保存pdf。

最后,您可以注入签名容器,如示例代码中所示:

代码语言:javascript
运行
复制
RandomAccessFile raf = new RandomAccessFile(signedFile, "rw");
raf.seek(offset);
raf.write(Hex.getBytes(cmsSignature));
raf.close();

这些方法的用例

如前所述,乍一看,这两种方法只支持不同的编程模式、回调和顺序。

虽然额外的选项确实允许支持其他用例,但在某些情况下特别方便:

如果签名服务速度慢,则

  • ,例如,因为请求是成批收集和处理的,或者是因为等待第二个因素的确认。

  • 如果检索和注入签名容器应该在不同的程序中进行,甚至可能是另一台计算机,而不是编写pdf.

什么是“外部签名”?像政府这样的第三方吗?

这里的“外部”是指程序的执行。虽然回调感觉非常内部,但按顺序顺序分离调用的感觉不那么明显,延迟签名可以被看作是真正的外部签名。

第三方签名服务(不管是政府还是非政府服务)都可以集成到任何一个体系结构中。视它们的性能而定,推迟的办法可能更可取。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65370941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档