使用iText对PDF文件签章和验章
PDF是国际板式文件标准,使用的范围很广。OFD为国产板式文件标准,设计起点很高,天然支持国产签名算法(SM2、SM3);具有后发优势,目前市场占有率仍然很低,前途光明而又漫长。PDF标准并不支持国产签名算法;但是,可以通过扩展达到支持的目的。PDF、OFD两者签名处理逻辑差异很大,关于ofd签名可以参见我写的其他文章。今天主要介绍通过itext,用国产签名算法实现对pdf的签名。
签名相关的两个概念:签名的保护范围和签名值。签名的保护范围确定了pdf中哪些内容不能更改,如果被更改验证就不同过。签名值:对保护范围的数据做哈希运算后,再用私钥签名生成的一段数据。
对已签名的pdf文件剖析
通过上图,就能大概明白:签名后,文件哪些数据做了修改。
采用itext实现签名
由于pdf不支持国产签名算法,必须通过接口回调的方式实现签名。首先要实现接口IExternalSignatureContainer。
我们的主要工作就是实现该接口,其他工作itext帮我们完成了。
采用itext实现验签
实现验签就必须获取签名的保护范围和签名值。看pdf内部结构:
下面的代码就是获取这两个值:
通过itext获取这两个值并不难,后期如何验证签名就完全取决于我们。
后记:从上面分析可以看出,pdf是可以支持国产加密算法的;由于国产加密算法不是pdf标准的一部分,阅读器对国产加密算法支持不是很好。ofd恰好弥补了pdf的不足,希望ofd的使用范围越来越广,在数字化建设中占有一席之地。
专注C#、C++。擅长WPF、WinForm、QT等技术。
研究ofd多年,开发了一些列产品。
技术交流QQ群:565438497。