PDF电子签名分析

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


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

签名后的PDF文档格式:

PDF电子签名分析_第1张图片

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

签名值的对象格式:

21 0 obj
</Filter/Adobe.PPKLite/M(D:20141005145612+08'00')/Name(CSP_test11)/Prop_Build<>/Filter<>/PubSec<>>>/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

</Cert[(0......?)]/Contents<0......>/Filter/Adobe.PPKLite/M(D:20141106102436+08'00')/Name(......)/Prop_Build<>/Filter<>/PubSec<>>>/SubFilter/adbe.x509.rsa_sha1/Type/Sig>>

endobj

多了个/Cert对象

时间戳:

16 0 obj
</Filter/Adobe.PPKLite/Prop_Build<>/Filter<>/PubSec<>>>/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> ]
/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签名





你可能感兴趣的:(PKI/CA,PDF,电子签名,PAdES)