也许这个更适合安全性?我不确定......
这些是事实:
我们有一个网络应用程序,用户可以使用表单下载PDF文档,填写此表单,使用电子证书进行签名并将其上传回我们的环境。
我们已经显示了上传文档已签名的情况,但它显示了签名后已更改的某些字段。如果我们检查PDF签名的完整性,则表明签名后已经进行了数据更改,但签名很好且有效。
如果我们右键单击签名并选择"请参阅签名版本"我们看到签名时加载的真实数据。
现在,这违背了我对电子签名功能的普遍看法。如果在签名后对文档(或加载到其中的数据)进行了任何更改,则此签名将变为无效,因为文档已被更改。
PDF的行为似乎有所不同,因为不仅签名仍然有效,而且"默认版本"打开文档时看到的是最后一个,而不是签名文档。
现在我想知道
如果这是一个已定义的行为,你如何处理?
答案 0 :(得分:2)
现在,这违背了我对电子签名功能的普遍看法。如果在签名后对文档(或加载到其中的数据)进行了任何更改,则此签名将变为无效,因为文档已被更改。
PDF的行为似乎有所不同,因为不仅签名仍然有效,而且打开文档时看到的“默认版本”是最后一个,而不是签名文件。
这是某种错误还是预期的行为?
这是预期的行为。 你必须要注意两个特殊因素:
PDF签名字段包含已签名字节范围的信息。显然不是整个文件可以签名,因为签名本身是嵌入的,不能是签名字节的一部分。因此,需要在某处记录带符号的字节范围。参看信息安全堆栈交换this answer:
可以通过追加到现有文档来添加PDF,这个过程称为增量更新。这些更新可以再次签名等,也参见the answer referenced above:
因此,通过增量更新对PDF进行更改,文档中的现有集成签名仍然可以正确地签署各自的签名范围。 尽管有了额外的变化,它们在数学上仍然有效。
此外,PDF的当前内容特别是由最新的增量更新定义,因此当您打开文档时,它会显示内容,包括最后的更改,而不是签名的更改。
现在,虽然听起来像PDF签名没有意义,但情况并非如此。规范ISO 32000-1明确定义了在对文档的基本版本的认证(=使用某些特殊标志签名)的增量更新中允许进行哪些更改,并且Adobe在其Acrobat和Reader软件中对此进行了外推限制。签署但未经认证的文件,参见堆栈溢出this answer。
特别是最多允许以下更改:
如果这是一个已定义的行为,你如何处理?
由于文档源自您,您可以首先将证书签名应用于文档,该证书只允许在您的用例中尽可能少地进行更改。
然后,您可以为用户要签名的签名字段定义签名锁定信息。在这些锁定信息中,您可以例如规定在签署给定签名字段后,许多表单字段应为只读。
最后,您只接受仍包含您的证书签名的PDF,并且不会添加任何不允许的更改。
实际上有许多PDF经过认证并包含许多用于其他批准签名的字段,每个批准签名字段都与一些表单字段相关联,这些字段在签名后将不再可编辑。签名后,所有字段都是只读的。
有什么地方可以找到有关此事的信息吗? (谷歌一次又一次地将我重定向到“如何签署PDF”文章)。
您应该特别关注PDF规范ISO 32000-1以及有关其软件行为的一些Adobe文档。您可以在上面提到的链接所指向的堆栈溢出文档页面的底部找到链接。