我们收到经过别有用心修改的签名 PDF 文件

We receive signed PDF documents with ulterior modifications

也许这个更适合这样的安全?我不确定...

这些是事实:

现在,这违背了我对电子签名功能的一般看法。如果我签名后对文档(或加载到其中的数据)进行了任何更改,则该签名将失效,因为文档已被更改。

PDF 的行为似乎有所不同,因为不仅签名仍然有效,而且您打开文档时看到的 "default version" 是最后一个,而不是签名的。

现在我在想

如果这是定义好的行为,你会如何处理?

Now, this goes against my general perception of electronic signature functionality. If any change is made to the document (or the data loaded into it) after I make a signature, this signature should become invalid, as the document has been altered.

The behaviour of the PDF seems to be different, as not only the signature still is valid, also the "default version" that you see when you open the document is the last one, not the signed one.

Is this some kind of bug or is a expected behaviour?

这是预期的行为。 这里你要注意两个特殊因素:

  • 一个PDF签名域包含签名的字节范围信息。显然不是整个文件都可以签名,因为签名本身是嵌入的,不能成为签名字节的一部分。因此,需要在某处记录带符号的字节范围。比照。 this answer 在信息安全堆栈交换上:

  • 可以通过 附加 到现有文档来添加 PDF,这个过程称为增量更新。这些更新可以再次签名等,也请参见。 the answer referenced above:

因此,通过增量更新对 PDF 进行更改,文档中现有的集成签名仍然正确地签署了各自的签名范围。 尽管增加了变化,它们在数学上仍然有效。

此外,PDF 的当前内容特别是由最新的增量更新定义的,因此 当您打开文档时,它显示的内容包括最后的更改,而不是签名的内容。


现在,虽然这听起来像是 PDF 签名没有任何意义,但事实并非如此。规范 ISO 32000-1 清楚地定义了允许在对文档的认证(= 带有一些特殊标志的签名)基本版本的增量更新中进行哪些更改,并且 Adob​​e 在他们的 Acrobat 和 Reader 软件中推断对已签名但未经认证的文件的限制,请参见。 this answer 堆栈溢出。

特别是最多允许以下更改:

  • 添加签名字段
  • 添加或编辑注释
  • 提供表单字段值
  • 数字签名

If this is a defined behaviour, how do you deal with it?

由于文档源自您,您可以首先对文档应用证书签名,这只允许在您的用例中进行尽可能少的更改。

然后您可以为您的用户要签名的签名字段定义签名锁定信息。在这些锁定信息中,您可以例如规定在给定的签​​名域上签名后,一些表单域应该是只读的。

最后,您只接受仍包含您的认证签名且未添加不允许的更改的返回 PDF。

其实有很多PDF是经过认证的,里面有很多额外的批准签名字段,每个批准签名字段都加上一些表单字段,签名后就不能再编辑了。所有签名字段都签名后,所有字段都是只读的。

There is any place where info on the matter can be found? (google keeps redirecting me once and again to "how to sign a PDF" articles).

您应该特别查看 PDF 规范 ISO 32000-1 和一些关于其软件行为的 Adob​​e 文档。您会在上述链接指向的堆栈溢出文档页面底部找到链接。