PDF文件下的无序电子签章方法
技术领域
本发明涉及一种PDF文件下的无序电子签章方法。
背景技术
在应用中,UKEY作为CA数字证书的一种载体,内部在存放数字证书的同时,也会存放对应的电子印章数据。通过CA的认证介质,能够将电子印章结合数字证书密钥对电子数据进行数字签名,形成有效的签名数据,作用于电子政务、电子商务等多个应用领域,解决了电子化签名的法律问题。
以公共资源交易为例,目前普遍采用CA数字证书+电子印章的方式贯穿于整个交易环节。在多个评委对评标结果进行会签场景时,每个评委用自己的UKEY对评标结果电子签章。目前很少采用多个评委对同一份评标结果一个一个的排序进行电子签章的方式进行会签,因为此方式效率最低。通常的解决方式是通过同步锁机制并发进行电子签章,但是由于PDF标准中后面签章的原文中包含前面签章对象,目前各个电子签章厂商的PDF电子签章实现都参照PDF格式规范进行实现,因此PDF文件的多个签章对象间存在前后依赖关系,导致采用副本会签时副本一致性同步控制问题(即多人并发签章,一人对副本签章,其他人能够立即看到修改),此控制类似多核CPU的缓存一致性控制问题,实现甚至更复杂,导致系统不稳定,而且在并发签章一个评委签章处理锁定期间,如果在输入PIN码等阻塞操作不及时处理会严重阻塞其它评委的处理,导致效率低下,体验性不佳。
如何有效的提高会签的效率,实现基于PDF文件的会签场景下的多人无序签章已成为了迫切需要破解的难题。
发明内容
为了解决上述问题,本发明提出一种实现高效率的并行签章,改善会签场景下的签章性能及用户体验,最终实现会签场景下的无序电子签章的PDF文件下的无序电子签章方法。
本发明的技术方案为:
PDF文件下的无序电子签章方法,包括如下签章合成的步骤:
对每个签章端分发一个PDF文件副本进行单独签章处理,每个签章端可以并行签章;
获取待合成PDF文件副本;
遍历已签章的PDF文件,从已签章的PDF文件副本提取公钥证书、章模、签章位置和签名值;
待合成文档副本的文档属性是否有原始文档范围,若有,则以文档属性中的原始文档范围为签名原文,利用提取的公钥证书、章模、签章位置预加盖签章,并填充提取的签名值;若无,则以文档所有数据为签名原文,利用提取的公钥证书、章模、签章位置预加盖签章,并填充提取的签名值,并在文档属性中记录原始文档范围。
该签章方法还包括如下验证步骤:
获取待验证签章对象的ByteRange(原始文档范围)和Contents(签名值);
根据ByteRange(原始文档范围)指示的签章原文范围获取签章原文;
根据签章原文计算文档哈希值Hash;
根据Contents(签名值)获取PKCS7签章结果;
验证PKCS7签章结果的完整性;
验证通过,则在PKCS7签章结果中获取文档哈希值Hash2;
Hash与Hash2比对,比对一致则验证通过,比对不一致则验证失败。
有益效果:
本发明通过改进PDF电子签章的文档保护范围,去除签章之间的先后依赖关系,进而可以使用文档可以根据提取签章信息无序的加盖合成,并且前端多人签章可以并发进行,而不依赖于其它签章人,后端再通过提取合成签章方式实现会签到同一PDF文件上,既保证文档安全性,又避开了复杂的同步控制处理。通过改进,可以避免复杂的同步控制,从而降低了系统复杂度,提高系统稳定性,也提升了可用性和用户体验。
附图说明
图1为本发明的签章合成流程图;
图2为本发明的验证流程图;
图3为本发明的签章原理图;
图4为本发明改进前后多人会签签章并发处理对比图;、
图5为本发明改进前后PDF签章追加方式和签章依赖关系对比图。
具体实施方式
下面结合附图1-5对本发明做详细介绍:
本发明签章合成时,遍历已签章PDF文件副本、从已签章PDF文件副本中提取公钥证书、印模、签章位置、签名值等信息,使用公钥证书、印模、签章位置预加盖签章,并用提取的签名值直接填充到签名值位置。
在合成首个签章时,在文档属性中记录原始文档范围,后续合成签章原文范围使用文档属性记录的原始文档范围作为签名原文。
如图1所示,签章合成流程如下:
第一步,对每个签章端分发一个PDF文件副本进行单独签章处理,每个签章端可以并行签章。
第二步,获取待合成PDF文件副本。
第三步,遍历已签章的PDF文件,从已签章的PDF文件副本提取公钥证书、章模、签章位置和签名值。
第四步,判断待合成文档副本的文档属性是否有原始文档范围;
若有原始文档范围,则以文档属性中的原始文档范围为签名原文,利用提取的公钥证书、章模、签章位置预加盖签章,并填充提取的签名值;
若无原始文档范围,则以文档所有数据为签名原文,利用提取的公钥证书、章模、签章位置预加盖签章,并填充提取的签名值,并在文档属性中记录原始文档范围。
验证时,根据签章结构中记录的签名范围、签名结果相关信息验证即可验证PKCS7签名结果完整性,并比对签名范围指定的签名原文摘要与PKCS7中保存的摘要进行比对是否一致,两者都验证通过,则签章验证通过,否则签章验证失败。具体的验证步骤如图2所示:
第一步,获取待验证签章对象的ByteRange(原始文档范围)和Contents(签名值);
第二步,根据ByteRange(原始文档范围)指示的签章原文范围获取签章原文;
第三步,根据签章原文计算文档哈希值Hash;
第四步,根据Contents(签名值)获取PKCS7签章结果;
第五步,验证PKCS7签章结果的完整性;
第六步,验证通过,则在PKCS7签章结果中获取文档哈希值Hash2;
第七步,Hash与Hash2比对,比对一致则验证通过,比对不一致则验证失败。
PDF电子签章是以增量方式更新文件,即签章对文件的修改都是在文件最后直接追加,原始文档范围内容不会做任何修改,通过改变签章对象的原文保护范围,使签章对象签名原文只依赖于原始的PDF文档范围(即在首次签章时文档中记录最原始的文档范围,使PDF文档自己知道自己的原始文档范围),去除签章之间的前后依赖关系,使PDF文件中的签章可以提取签章信息,并可以使用提取的签章信息合成签章到相同的副本上。这样由于签名原文是一样的,直接用提取的签章信息中的签名值去合成签章,合成后文档就可以正确的验证通过,无需再重新计算签名值,去除合成签章时对UKEY的依赖。
本发明的PDF签章实现会签场景下的无序电子签章应满足以下几个基础条件:
(1)PDF首次签章时在文档扩展字段中记录文档的原始范围。
(2)PDF电子签章对象间去依赖,每个电子签章只依赖原始文档。
(3)每个签章信息可以提取、并在副本合成。
(4)提取时提取签章必要信息,合成时重新加盖并填充提取信息。
(5)签章信息合成时,不再重新计算签名,直接合成就能验证。
对于多人签章情况,需要采用并发处理机制进行控制,本发明采用类似多线程中线程局部存储以空间换时间的思想,对每个签章端分发一个副本进行单独签章处理,使每个签章端可以并行签章。
本发明PDF签章实现会签场景下的无序电子签章应满足并行处理:
(1)每个签章端分发一个副本进行并行签章
基于以上基础条件和并行签章处理,就可以实现基于PDF文件的会签场景下的多人无序签章。此方式避开两个复杂问题,第一个:并行签章对副本的一致性控制问题。第二个:一致性控制和PDF签章对象前后依赖导致的必须按队列方式进行有序合成的问题。
在省公共资源交易中,在会签场景下,对多评委并发签章及用户体验有更高的要求,目前已经初步实现基于PDF版本文件的多个评委对评标结果无序电子签章的应用。
架构设计上,其结构原理图如图3所示。签章时,多个签章人在各自打开的待签章的PDF文件副本中进行签章;合成时,从已签章的PDF文件副本提取签章相关信息,在待合成PDF文件副本中重新加盖。为了签章合成后能验证通过,又避免重新插入UKEY签名,需要保持签名原文一致,始终以原始文档范围内容作为签名原文。
在具体实现方式细节上改进分两个方面进行对比:
多人电子签章会签并发处理上进行对比,如图4所示。
在PDF文件电子签章合成实现方式及签章之间先后依赖关系上进行对比,如图5所示。图5中,阴影部分表示签章保护原文范围,粗线框内内容表示签章追加的内容。
由图4和图5所示,PDF文档签章由于签名保护原文范围的不同,存在包含关系,导致签章之间存在先后依赖关系,继而导致多人签章时要实时同步,用户签章前需要先同步这种依赖关系再签章,才能保证签章提取合成后文档能验证通过,同步处理过程需要通过副本一致性协议来保证,即一方签章,其它方能实时看到,即便如此实现,多人签章的性能瓶颈主要取决于用户并发操作时界面阻塞时间的粒度,体验性不佳。
本发明通过改进PDF电子签章的文档保护范围,去除签章之间的先后依赖关系,进而可以使用文档可以根据提取签章信息无序的加盖合成,并且前端多人签章可以并发进行,而不依赖于其它签章人,后端再通过提取合成签章方式实现会签到同一PDF文件上,既保证文档安全性,又避开了复杂的同步控制处理。通过改进,可以避免复杂的同步控制,从而降低了系统复杂度,提高系统稳定性,也提升了可用性和用户体验。