签名的 PDF 真的安全吗?绿色对勾能证明什么,不能证明什么

A woman in period dress signing a document with a quill pen

你打开一份合同,PDF 阅读器显示出一个绿色对勾:已签名,且所有签名均有效。大多数人把这句话读作”这份文档是真的,而且没有被改动过”。这样理解并不算离谱。只是对勾的含义并不完全是这个。

这两者之间的差距,在理论上很小;而正如一组研究人员所演示的,它在实践中大到足以让一整份合同从中穿过去。

数字签名真正承诺的是什么

先说诚实的那一面,因为这确实是一项有用的技术,本文没有任何一句是在反对使用它。

当某人给一份 PDF 签名时,他的软件会计算出这份文档内容的指纹,再用只有他自己持有的私钥把这枚指纹加密。之后你的阅读器会重新计算一遍指纹,把对方的那一枚解密出来,然后作比较。如果两者一致,就确立了两件事:文档自签名以来没有改变过,以及为它签名的是持有那把密钥的人。

这是真实而且有价值的。它同时也比”这份文档值得信任”要窄得多。签名并不说明内容是否属实,不说明签名者是否读过内容,也不说明那张证书是否属于你以为的那个人。

位于这一切核心的那个别扭功能

PDF 有意思的地方就在这里。这个格式允许增量更新——你可以把改动追加到文件末尾,而不必重写整个文件。加一条批注、填一个表单字段,原来的字节仍然分毫不动地留在原处,新增的内容挂在后面。

这么设计是有正当理由的。正是它让好几个人能够依次为同一份文档签名:每一个签名覆盖它之前的全部内容,而添加第二个签名不能让第一个失效。

由此带来的后果是,一份已签名的 PDF 可以在签名之后合法地发生变化,并且照样显示签名有效。阅读器本应注意到这一点并告诉你。它们到底会不会,才是整个问题所在。

影子攻击

2020 年,波鸿鲁尔大学的研究者 Christian Mainka、Vladislav Mladenov 和 Simon Rohlmann 发表了他们称之为影子攻击(Shadow Attacks)的研究成果,并在 NDSS 研讨会上作了报告。

这个思路简单得让人不安。攻击者准备一份含有两套内容的文档:一套是受害者预期看到并签名的版本,另一套是隐藏起来的第二个版本。受害者审阅了那个无害的版本,签了名,把文件送了回来。攻击者随后用一次完全合法的增量更新,把隐藏的内容翻到前台。

签名依然通过验证。什么都没有被破坏。攻击者用的只是规范本身提供的功能——隐藏图层、表单字段,以及只允许追加的更新机制。

研究人员测试了 29 款 PDF 阅读器。其中 16 款存在这个漏洞,包括 Adobe Acrobat 和 Foxit Reader 这样广泛使用的产品。厂商收到了通报,修复也随之发布——事情本来就应该这样运转。但这项发现告诉了你一件更持久的事:一个绿色对勾究竟能承载多少分量。

对勾没有告诉你的另外四件事

证书究竟握在谁手里。任何人都能弄到一张证书,并在上面写一个名字。除非它能一路追溯到你的系统信任的某个权威机构,否则”由 Jan Kowalski 签名”只说明有人把这个名字打了上去。阅读器会区分”签名有效”和身份”受信任“,而这个区别一眼扫过去很容易漏掉。

证书在签名当时是否有效。证书会过期,也会被吊销。用一张后来被吊销的证书做出的签名,可能照样显示得一切正常——除非你的阅读器去检查吊销状态,而这需要一次网络查询,有时候它会悄无声息地失败。

被签名的到底是哪些内容。一个签名可以只覆盖文档的一部分,而不是全部。此后添加的内容,完全落在受保护的范围之外。

签名者是否认同其中的内容。签名是一次密码学运算,不是理解并同意的证据。这话说出来是显然的,实际中却常常被忘掉。

三样看着像签名、其实不是签名的东西

在给出检查建议之前,先说一个区分——它造成的混淆比密码学本身还要多。

贴进文档里的手写签名图片什么也证明不了。它就是一张图。任何拿到这份文档的人,都能把这张图复制到另一份文档里去。这种做法极其常见,也被广泛误认为就是”已签名的文档”。

签名栏里打出来的姓名是一种意愿的表示,而不是密码学事实。依具体情形和司法辖区不同,它完全可能具有法律意义——但你的阅读器无法对它验证任何东西,它也提供不了任何防止文件被改动的保护。

由电子签名平台加上的签名介于两者之间,而且差别极大。有些平台会给最终的 PDF 加上一个真正的数字签名,你的阅读器可以校验它。另一些则把签署事件记录在自己的审计日志里,产出的 PDF 上只显示一张图片和一个编号。第二种也是证据,但它存在于平台的服务器上,而不是存在于文件里;如果你只留着这份 PDF,它就消失了。

如果这件事很重要,检验方法很简单:你的 PDF 阅读器会不会显示出一个里面带着证书的签名面板?如果不会,那么无论你看到的东西长什么样,它都不是数字签名。

怎样正确地检查一个签名

这些都不需要专门的软件——只需要去看你的阅读器本来就在告诉你的东西,而不是只盯着那个对勾。

打开签名面板。别停在状态栏上。在 Acrobat Reader 里,点开签名面板,把细节读一遍。你要确认三件事:签名是有效的;身份是受信任的,而不只是”存在”;以及文档自签名以来没有被修改过。

留意签名之后的改动。阅读器报告它的说法通常是”该文档在签名后已被修改”,或者干脆列出文档的若干个版本。这条提示不是走过场。如果一份合同显示签名之后有过改动,先问清楚改了什么,再做别的任何事。

看看证书是谁签发的。自签名证书和来自受认可权威机构的证书不是一回事。对任何具有法律分量的东西来说,这个区别正是关键所在。

让你的阅读器保持更新。影子攻击的修复是随更新发布的。下一个问题的修复也会是这样。

凡是重要的事,都换一条渠道确认一遍。如果一份签名文档指明了把钱打到哪里,请用你早就有的号码给对方打个电话。任何密码学都挡不住一个已被攻破的邮箱账户;而无论那个文件做得多巧妙,光是这一个习惯就能挡下大多数发票诈骗。

这对日常工作意味着什么

签名值得使用。这里的教训不是要你不相信它们——而是要读懂它们实际主张的是什么,那比界面暗示的要窄。

有一点和本站直接相关,值得提一句:如果你要处理已签名的文档,务必留意你把它们送进了什么工具。许多用来合并、拆分或转换 PDF 的工具都会让签名失效,因为签名覆盖的是文件确切的字节,而这些操作会把这些字节重写一遍。这不是缺陷,这正是签名在尽它的本职。但它确实意味着:一份已签名的合同,在被任何东西碰过之前,应当先按原样归档;这也是一个很好的理由,说明为什么这类文档应该留在你自己的机器上,而不是上传到某个你无法查看其处理过程的服务。

PDF Manipulator 完全在本地运行,所以你在其中处理的已签名文档永远不会离开你的电脑。它不会把一个无效的签名变成有效的,也不会告诉你某张证书是否值得信任——这个判断依然留在你手里。

简单来说

绿色对勾意味着文件与它的签名相符。它不意味着签名者就是名字上写的那个人,不意味着证书仍然有效,也不意味着此后没有添加过任何东西。打开签名面板,读一读身份信息,检查签名之后的改动——而但凡牵涉到钱,请拿起电话。

参考来源

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部