原文:Digital Signatures in a PDF

三、PDF语言签名功能

1. 标准支持

PDF本身是一个开放的ISO标准。ISO 32000对PDF中的数字签名支持进行了全面描述,Adobe在其开放SDK中提供了与PDF和Acrobat系列产品api交互的工具。但是,PDF中也内置了对其他标准的支持,像Acrobat和Adobe Reader这样的PDF阅读器应该遵守表2(注:见原文第五部分)中列出的标准。

2. 支持替换签名方法

大多数签名都是纯数学的,例如由Arcobat的默认签名处理程序生成的公私钥加密文件摘要。然而,它们也可以是生物识别的形式,例如手写签名、指纹或视网膜扫描。签名处理程序根据PDF ISO标准中定义的规则处理数据并控制身份验证的形式。

3. 支持两种签名类型

PDF定义了两种类型的签名:批准和认证。这两种类型都是覆盖所有文件内容的字节范围签名。两者都可以在文件签署时对文件进行可视化快照,从而提供高级别的文件完整性。
区别如下:

  • 批准:一份文件中可以有任意数量的批准签名。该字段可以选择与FieldMDP权限相关联。参见“锁定表单域”部分。
  • 认证:一份文件只能有一个认证签名且必须为第一个。该字段总是与DocMDP(参见“控制签署后变更”部分)和法律内容证明相关联。它们可以选择与FieldMDP权限相关联。

4. 签名互操作

PDF允许在签名处理程序和合格阅读器之间的互操作。也就是说,使用处理程序ABC签署的PDF应该能够使用来自不同供应商的处理程序XYZ进行验证。
当存在时,签名字典中的SubFilter条目指定签名值和密钥信息的编码,而Filter条目指定应用于验证签名的首选处理程序。SubFilter条目有几个定义的值,所有这些值都基于RSA Security发布的公钥加密标准,也是国际互联网工程任务组(IETF)公钥基础设施(PKIX)工作组发布的标准的一部分。

5. 鲁棒算法支持

随着安全问题的发展,PDF扩展了对日益强大的加密算法的支持,如下所示。 可以通过种子值或在应用程序首选项级别(例如注册表)来指定摘要算法。
algorithm support

6. 多重签名

有些文件可能需要多个签名。 只需要在纸上画另一条线就可以很容易地处理纸质文件。在纸张世界中,在文件上签署的人应该明智地在文件签署后保存副本。然后,如果另一个人更改了文件,签名者可以很容易地辩称文件已被更改。
但是,对于PDF,任何通过修改文件(如再次签署)来更改文档的尝试都将使现有的数字签名无效。这是因为验证时计算的哈希值与签署时创建的加密哈希值不匹配。
PDF通过支持增量更新的功能解决了这个问题(参见“增量更新”部分)。只要其他权限限制(如DocMDP和FieldMDP)不阻止其他签名,签名者就可以向文件中添加另一个签名字段并签名,而不会使先前的签名无效。

7. 增量更新

PDF文件格式定义了增量更新功能。增量更新对查看文件的人是透明的,但允许检测和审核对文件的修改。 通常,PDF语言(特别是针对已签署文件)允许任何PDF文件通过在文件末尾增加增量更新部分来进行修改。不需要对表示文件早期版本的字节进行任何更改。这样就可以往PDF文件添加签名而不会修改之前签名覆盖的任何数据。
每个附加签名将覆盖整个PDF文件,从第0个字节到最后一个字节,但不包括当前签名值的签名值。图5展示了如何为具有三个签名的文件创建签名。
incremental update

8. 查看之前的签署文件版本

PDF语言的增量更新功能允许PDF阅读器有效保留任何PDF文件的所有签署版本。这使得用户能够实际看到已签署的PDF文件的版本。
Acrobat通过提供两种特性来充分利用PDF的能力达到签署时“记住”文档状态:

  • 查看签署版本:通过右键单击签名并选择“查看签署版本”,显示应用签名时的文件。这个操作可以通过删除与签名对应的文件EOF之后任意字节来手动模拟。
  • 比较签署版本与当前版本:通过右键单击签名并选择“比较签署版本与当前版本”,将文件的当前版本与签署版本进行比较。

9. 比较当前文件版本和签署文件版本

参见“查看之前的签署版本”部分

10. 锁定表单域

表单域包括签名域和非签名域,表单通常包含许多表单域,有些是为签名设计的,有些是为表单数据设计的。PDF语言允许作者控制文档签名后是否可以填写额外的字段,不论是通过签名,还是通过输入任何类型的数据。创建文档时,作者可以指定以下内容:

  • 是否可以在不使批准或认证签名失效的情况下填写表单域。
  • 在特定的接收者签署文件后,任何对特定表单域的修改都会使这个接收者的签名无效。在这种情况下,为每个接收者指定一个单独的签名域。
    FieldMDP转换方法用于检测文档表单域值的更改。(见图1)

11. 控制签署后变更

PDF提供了一种限制后签名的机制。该机制是DocMDP转换方法(修改、检测和预防的缩写)。DocMDP转换参数字典中的P条目指示对文件的以下哪些更改将使签名无效(见图1):

  • 任何修改
  • 表单填写和数字签名
  • 注释(评论)、表单填写、数字签名
    文件只能包含一个包含DocMDP转换方法的签名域,并且必须是文档中的第一个签名域。该签名称为“认证”签名。此功能允许作者指定哪些更改是允许的,哪些更改使作者的签名无效。然而,大多数用户会认为DocMDP的作用是指定他们可以对文档做什么。
    认证签名应具有一个合法的证明字典,该字典指定可能导致文档内容非预期解读的所有内容,以及作者对此类内容的证明。如果文件的完整性受到质疑,本字典可用于确定作者的意图。
    Acrobat允许第一个签名者使用认证签名来认证文档,并在签署过程中设置权限和法律证明。
    打开已认证的文件时,除了打开已认证时存在的文件并将其与当前正在查看的内存中的文件(包括所有增量更改)进行比较外,签名会像往常一样被验证。进行修改分析,任何作者禁止的修改会被报告。违反权限会破坏签名。

12. 法律内容证明

鉴于其内在的丰富性,PDF语言提供了许多可能导致PDF文档呈现外观变化的功能(例如多媒体或JavaScript)。这些功能会有意或无意地构造误导文件收件人的文件。在考虑签署的PDF文件的法律含义时,这些情况是相关的。
为了促进文件信任,合格的认证签名作者(例如Acrobat)也应利用PDF的法律证明字典。字典条目指定所有可能导致文档内容意外呈现的内容。此外,作者可以通过证明条目(Attestation entry)进一步澄清此类内容。审稿人应自己确定他们信任作者和文档内容。

13. 基于文件权限启用功能

PDF使具有丰富PDF交互的功能齐全的客户端能够向功能较差的客户端授予文档特定的权限,以便它们也可以使用其中的一些功能。使用此机制,可以向不具有数字签名功能的客户机授予该功能。当在特定文件的语言级别授予权限时,任何与签名相关的用户界面元素都将启用。
例如,使用Acrobat的作者可以使用公钥加密技术授予在Adobe Reader中启用其他功能的权限。它使用证书颁发机构向与其建立业务关系的文件创建者颁发公钥证书。Adobe Reader验证授权签名是否使用Adobe授权证书颁发机构的证书。因此,打开阅读器支持文档的Adobe Reader用户可以签名、填写表单字段,反之执行被禁止的操作。
这种机制称为使用权签名,通常对终端用户是透明的。使用权限签名是从权限字典中的UR3条目引用的(图1)。签名启用了其他交互式功能,这些功能在符合条件的阅读器中可能默认情况下不可用,并验证权限是否已由真正的授权机构授予。转换参数字典指定了在签名有效时应启用的附加权限。如果签名由于任何原因无效,则不会授予其他权利。

14. 富证书处理

PDF支持富证书加工和处理功能,因为它的证书数据是嵌入到签名中的。PDF阅读器和签名处理程序可以根据需要使用这些数据。例如,当使用PKCS#7签名,签名对象可以包含以下部分或者全部:

  • 时间戳信息
  • 嵌入的吊销信息
  • CRLs和OCSP的吊销检查详情
  • 证书策略和属性证书

15. 通过种子值控制签名工作流

PDF对种子值的支持在文档被路由到签署方后,为作者提供了对文件行为的字段级控制。种子值指定属性和属性值,作者可以控制指定的参数是可选的还是任何特定字段必须包含的。
例如,您可以使用种子值来限制用户在签署特定的签名字段时的选择,例如要求使用特定CA颁发的证书进行签名。当签名者签署一个“种子”字段时,作者指定的行为将被自动调用且是强制的。
如果字段字典包含引用种子值字典的SV条目,那么当字段被签名时将使用该字典。Ff条目指定字典中的其他条目是否应该被考虑,或者是否仅仅是推荐。Acrobat的默认处理程序支持PDF标准定义的所有种子值。Acrobat为种子值字段提供了api。
seed value