使用Java向PDF添加数字签名

11

我想使用存储在USB令牌、HSM等设备中的证书对PDF文件进行数字签名。如何使用JAVA调用存储在USB令牌上的私钥?

3个回答

10

8

添加数字签名到PDF文件的步骤:

(I) 创建模板PDF文档:

创建带有模板签名的PDF文档:

PDSignature pdSignature;
pdSignature.setByteRange(new int[]{0, 0, 0, 0});
pdSignature.setContents(new byte[n*1024]);

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

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

(II)更新模板PDF文档:

(a) 更新/ByteRange[a b c d]:
(i) a=“%PDF”中“%”的偏移量(默认为0)
(ii) b=“/Contents<000...000>”中“<”的偏移量
(iii) c=“/Contents<000...000>”中“>”的偏移量
(iv) d=“%%EOF”中“F”的偏移量减去上述c值

(b) 更新xref部分:
更新描述对象位置的交叉引用表(xref部分)

(c) 更新startxref部分:
更新startxref,即交叉引用表(xref)开头的偏移量。

(III)生成更新后模板文件的数字签名:
生成更新后的模板文件数字签名,不包括“/Contents<000...000>”中的临时签名数据(“000...000”)

(IV) 更新Content<>部分:
将“/Contents<000...000>”中签名数据长度的第一个/初始“0”替换为模板PDF文件的签名数据(加密)。

建议:

使用PDFBox的SignatureInterface:

(a) 实现SignatureInterface以调用sign()方法 (b) 提供输入、输出文件、密钥库、别名、PIN (c) 进行保存增量

(或者)使用任何Java PDF库(如iText…)

(或者)自己用Java实现步骤I-IV。


这个问题似乎不是关注PDF文档的更改,而更多地关注如何使用存储在USB令牌上的私钥。 - mkl

4
似乎您想使用USB令牌、智能卡或硬件安全模块数字签署PDF。这是通过PKCS#11实现的,详见http://itextpdf.com/book/digitalsignatures。您可以在此处找到源代码。这个是一个示例,展示了如何使用SafeNet iKey 400 USB令牌进行签名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接