PDF电子签名分析

from  http://blog.csdn.net/arlaichin/article/details/40351543

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签名

相关推荐
WORD2003签名签章插件 1.前言 这是我学习ATL的成果,学习过程及程序的编写,前前后后共用了一个多月的时间,花了不少的心血。其间遇到了不少困难,终于都一一解决了。这要感谢www.csdn.net上的热心朋友,从他们的BLOG文章中,我获得了不少灵感。现在这个软件基本完成了,全部实现了我自己定的设计需求,自己觉得这个软件还有一定的用处,就把它的测试版发布一下,希望使用者多提宝贵意见。 注:测试版没有任何的功能限制,只是“关于”对话框中显示测试版字样。 2.功能 可以完成手写签名及插入签章的功能。插入签名或签章后,可以监控WORD文档是否被修改。软件的使用界面很简单,只是在WORD里插入了一个工具栏,上面有三个按钮。其它的功能在插入的签名或签章上按右键根据弹出菜单选择执行。 印章支持多种格式图片,如BMP,JPG,GIF(静止的)等,使用时用印章管理工具把这些导入到印章库即可。 印章库管理密码:12345   几个内置的印章使用密码:111111 3.软件的使用:   使用windows系统带的控件注册工具regsvr32.exe,注册一下XXHSignature.dll即可;或者直接运行当前目录下的Register.exe,也可完成注册。这样打开word就可以看到签名工具栏。 软件包含以下几个文件: steal.mdb 印章库。 xxhsignature.ini 配制文件,如果没有会自动生成。 XXHSignature.dll WORD2003的COM加载项。程序的主体。 Register.exe 注册/卸载XXHSignature.dll用,可以不使用,直接使用regsvr32。 register.bat 注册的快捷方式,调用register.exe。纯属辅助,方便使用。 unregister.bat 卸载的快捷方式,带命令行参数调用register.exe。纯属辅助,方便使用。 StealManager.exe 印章管理工具。 说明文档.txt 说明文档。 软件使用VC6、ATL开发,没有使用MFC,所以每个软件都很小巧。 我在开发时使用的环境为XP、WORD2003,对软件在其它环境下没有进行过测试,不知道存不存在兼容问题。期待大家的反馈,可以给我发EMAIL,或者到我的博客留言。 如果程序运行有问题,可以使用Unregister.bat或regsvr32 /u将其卸载即可。也可以使用WORD的加载项管理菜单(该菜单默认时不显示,可以点击工具->自定义中找到使之显示),禁止插插件启动时运行。 另外:软件编译为UNICODE,对WIN98肯定是不支持。 欢迎转载,转载时请不要删除这些信息。谢谢。 2006-04-25 作者:wallimn email:wallimn@sohu.com QQ:54871876 博客:http://blog.csdn.net/wallimn 1.1版更新   新版的进行了以下几项改进:     a.签名及签字对文档内容、文档字体颜色以及文档字体大小敏感,也就是说:修改文档内容、文档中任意字的字体颜色或大小,都会导致文档签名失效。这是个很重要的功能,不知大家有没有意识到。试想一下,如果对合同签字,合同金额为100000,在WORD里将数字的后几个0改成白色,如果签名不对字体颜色敏感,那么签名仍然有效,而合同金额看起来就锐减了。所以说,对字体颜色及大小不敏感,是个很严重的漏洞。市场上的几款其它签名软件基本都有这个漏洞。     b.修改了WORD中签名工具栏有时不显示的BUG。     c.当文档签名失效时,重新打开文档的时候,会显示个红叉,直观的显示签名失效。 2008-02-23 1.2版更新   添加了读取网络图章功能,可以通过HTTP协议读取放在远程网络上的图章。不需要专门的图章服务器,可以使用任意的WEB服务提供程序,如IIS,tomcat等,将软件包中的web目录部署(白话:拷贝)到WEB的某个目录(tomcat中,考到某个上下文)就可以了。   然后在“网络图章”对话框中,输入对应的地址,如:http://127.0.0.1/web,点刷新就可以了。 2008-10-17
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页