PDF电子签名分析

PDF文档结构分析可参见:http://blog.csdn.net/pdfMaker/article/details/573990。下面仅对PDF的电子签名进行分析


PDF的签名标准是 PAdES,ETSI TS 102 778.

签名后的PDF文档格式:

其实符号“<>”并没有算入被签名里面

签名值的对象格式:

21 0 obj
<</ByteRange[ 0 60202 65080 4917] /Contents<30........000000>/Filter/Adobe.PPKLite/M(D:20141005145612+08'00')/Name(CSP_test11)/Prop_Build<</App<</Name/Reader/OS[/Win]/R 720903/REx(11.0.7)/TrustedMode true>>/Filter<</Date(May  8 2014 13:48:44)/Name/Adobe.PPKLite/R 131104>>/PubSec<</Date(May  8 2014 13:48:44)/NonEFontNoWarn true/R 131105>>>>/SubFilter/adbe.pkcs7.detached/Type/Sig>>
endobj

为什么Contents里面会有这么多0,因为需要先预算出ByteRange,所以先预多一点签名值数据,不够就补0

对Contents<>里面的数据进行分析,可知签名格式分:

adbe.pkcs7.detached(P7不带内容)
adbe.pkcs7.sha1(P7带内容。先对PDF数据做SHA1,再把SHA1数据作为P7内容,相当于做了2次摘要)
adbe.x509.rsa_sha1(数字证书+P1签名)
ETSI.CAdES.detached(CAdES不带内容)

以上签名格式可以在注册表修改:

[HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader\11.0\Security\cPubSec]

"aSignFormat"="adbe.pkcs7.detached"

参考资料:http://www.adobe.com/devnet-docs/acrobatetk/tools/PrefRef/Windows/Security.html

adbe.x509.rsa_sha1签名:

21 0 obj

<</ByteRange[ 0 63435 63715 4925]/Cert[(0......?)]/Contents<0......>/Filter/Adobe.PPKLite/M(D:20141106102436+08'00')/Name(......)/Prop_Build<</App<</Name/Reader/OS[/Win]/R 720905/REx(11.0.9)/TrustedMode true>>/Filter<</Date(Sep 12 2014 09:43:12)/Name/Adobe.PPKLite/R 131104>>/PubSec<</Date(Sep 12 2014 09:43:12)/NonEFontNoWarn true/R 131105>>>>/SubFilter/adbe.x509.rsa_sha1/Type/Sig>>

endobj

多了个/Cert对象

时间戳:

16 0 obj
<</ByteRange[ 0 1476 13782 4877]/Contents<3082072e....0000>/Filter/Adobe.PPKLite/Prop_Build<</App<</Name/Reader/OS[/Win]/R 720903/REx(11.0.7)/TrustedMode true>>/Filter<</Date(May  8 2014 13:48:44)/Name/Adobe.PPKLite/R 131104>>/PubSec<</Date(May  8 2014 13:48:44)/NonEFontNoWarn true/R 131105>>>>/SubFilter/ETSI.RFC3161/Type/DocTimeStamp/V 0>>
endobj


文档分析:
/Type/XRef/Root->/Type/Catalog/AcroForm<<>>->/Fields->/Type/Annot/FT/Sig /V->/Type/Sig
签名的外观:
/FT/Sig/AP<<>>->/N->......->/Type/XObject/Subtype/Image

PDFBOX代码分析:
org.apache.pdfbox.pdfwriter.COSWriter类
public void write(PDDocument doc) throws COSVisitorException方法
第1484行:
if( idArray == null || incrementalUpdate)
改为:
if( idArray == null/* || incrementalUpdate*/)
incrementalUpdate时,没必要重新设置文档ID值
19 0 obj
<<
/ID [<0F6BB651C0480213FBBD13449B40FE8F> <B934922E549FD4419D0358EDEED7E391>]
/Info 6 0 R
/Root 8 0 R
/Prev 116
/Type /XRef
/Size 20
/Filter /FlateDecode
/Index [8 2 15 4]
/W [1 2 0]
/Length 26
>>
stream
x渃鰃?d匏(罉`葮0
endstream
endobj

方法
private void doWriteSignature(COSDocument doc) throws IOException, SignatureException
用于写入签名值。该方法没有根据不同的SubFilter进行不同的处理,显然无法处理adbe.x509.rsa_sha1签名




评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值