使用Java中的自定义数字签名对Pdf进行签名

我使用Sun的代码创建了一个数字签名: http : //download.oracle.com/javase/tutorial/security/apisign/examples/GenSig.java 。 如何使用此数字签名签署pdf文件? 那就是:如何将签名添加到pdf文件中?

你采取了错误的做法。 您无法轻易地将签名附加到PDF。 PDF规范包括对数字签名的支持。 这些签名嵌入到文档中,并且它们的计算是一个非常重要的过程。

你最好的选择是放弃你当前的实现并采取例如。 iText库或我们的SecureBlackbox将为您完成这项工作。

如果您的任务是自己实现签名,那么请使用PDF规范,阅读并实现相应的部分(在这种情况下,您的问题太宽泛,无法以StackOverflow格式回答)。

将数字签名添加到PDF文件中涉及的步骤:

(I)创建模板PDFDocument:

使用模板签名创建PDFDocument:
PDSignature pdSignature,
pdSignature.setByteRange(new int [] {0,0,0,0});
pdSignature.setContents(new byte [n * 1024]);

其中n是整数,即kbs的倍数。

注意:内容大小应大于或等于签名和证书文件长度的总和。

(II)更新模板PDF文档:

(a)更新/ ByteRange [abcd]:
(i)a =“%PDF”中的偏移%(默认情况下= 0)
(ii)b = 的偏移量”
(iii)c =在“/ Contents <000 ... 000>”中偏移>
(iv)d =“%% EOF”-c中F的偏移量

(b)更新外部参照部分:
更新交叉引用表(外部参照部分),指定对象的位置和

(c)更新startxref部分:
update startxref,它是交叉引用表(xref)的起始偏移量。

(III)生成更新的模板文档的数字签名:
生成更新的模板文档,排除“/ Contents <000 ... 000>”的签名数据(“000 … 000”)

(IV)更新内容<>部分:
使用模板PDFFile的签名数据(Enveloped)替换“/ Contents <000 ... 000>”中的签名数据长度的第一个/初始“0”。

建议:

使用PDFBox的SignatureInterface:

(a)实现SignatureInterface调用sign()方法(b)提供输入,输出文件,密钥库,别名,pin(c)做保存incrment

(或)使用任何java pdf库(如iText …)

(或)自己在Java中实现步骤I-IV。