PDF格式分析(五十二)Digital Signatures 数字签名

数字签名(PDF 1.3)可用于验证用户的身份和文档的内容。 它在签名时,保存了有关签名者和文档状态的信息。

签名可以是纯数学的,例如公钥/私钥加密文档摘要,也可以是生物识别形式的,例如手写签名,指纹或视网膜扫描。

ISO 32000中的数字签名目前支持两种活动:一、向文档添加数字签名,二、检查该签名的有效性。 撤销信息是签名的一个属性,这意味着签名时,必须在签名之前先获取吊销信息。 类似的要求也适用于证书链,签名软件必须在签名之前获取并验证证书链。

签名信息保存在签名字典中。签名处理程序可以使用或省略(被标记为可选的条目,但如果被设置为标准方式,则要使用它们)。

此外,签名处理程序可以添加自己的私有条目。 为避免名称重复,所有此类私有条目的键,应以注册的处理程序名称为前缀,后面跟上句点符号(2Eh)。

通过计算文档中数据(或部分数据)作为摘要,并将摘要存储在文档中来创建签名。 为了验证签名,应重新计算摘要并将其与存储在文档中的摘要进行比较。 摘要值如果存在差异,则表明文档签署后,已进行了修改。

数字签名在PDF表现形式

PDF格式分析(五十二)Digital Signatures 数字签名_第1张图片

签名工作流

PDF格式分析(五十二)Digital Signatures 数字签名_第2张图片

有两种定义的技术用于计算PDF文件的全部或部分内容的数字签名:

  1. 签名字典中的ByteRange条目保存有计算字节范围摘要的字节范围。 此范围应该是整个PDF文件,包括签名字典,但不包括签名值本身(Contents条目)。 当然也可以使用其他范围,但由于它们不能检查到文档的所有更改,因此不建议使用。 当存在字节范围摘要时,签名字典中的所有值都应是直接对象。
  2. 另外,修改检测可以由签名参考字典指定。 TransformMethod条目应指定修改检测的一般方法,TransformParams条目应指定方法的可变部分。

PDF格式分析(五十二)Digital Signatures 数字签名_第3张图片

PDF文档可以包含以下几种标准类型的签名:

  1. 批准签名,该类型签名允许一个或多个。 这些签名出现在签名表单域中(请参见“签名域”)。 签名表单域的值(由其V条目指定)与签名字典对应。 注:多个前面,必须使用增量更新保存签名文档,这样,就会保留与原始签名的字节范围对应的数据,使得前面的签名有效,而新增加的前面,通过使用当前的文档状态进行签名,来保证新签名的有效性。
  2. 证书签名(PDF 1.5),该类型签名最多只允许存在一个。 证书签名的签名字典应为签名字段的值,并应包含ByteRange条目。 它也可以从权限字典(见“权限字典”)中的DocMDP条目引用。 签名字典应包含具有DocMDP转换方法的签名引用字典。 有关如何创建和验证这些签名的信息,请参见“DocMDP”。用于证书或批准签名的签名字典还可以带有FieldMDP变换方法的签名参考字典; 见“FieldMDP”。
  3. 使用权签名(PDF 1.5),该类型签名最多允许两个。 其签名字典应从权限字典中的UR3(PDF 1.6)条目引用。 签名字典应包含一个Reference条目,其值是具有UR变换方法的签名引用字典。有关如何创建和验证这些签名的信息,请参见“UR”。

Entries in a signature dictionary(签名字典中的条目)

key type value
Type name (可选)如果存在,则应为Sig。
Filter name (必需;可继承)验证签名时,首选签名处理程序的名称。 如果Prop_Build条目不存在,它也应该是用于创建签名的签名处理程序的名称。 如果Prop_Build存在,则可以使用它来确定创建签名的处理程序的名称(通常与Filter相同但不是必需的)。签名处理程序可以是Adobe.PPKLite,Entrust.PPKEF,CICI.SignIt和VeriSign.PPKVS。
SubFilter name (可选)描述签名值和密钥信息使用编码的名称。 (PDF 1.6)应使用以下公钥加密签名值:adbe.x509.rsa_sha1,adbe.pkcs7.detached和adbe.pkcs7. sha1。
Contents byte string (必填)签名值。 当存在ByteRange时,该值应为十六进制字符串,表示字节范围摘要的值。 对于公钥签名,Contents应该是DER编码的PKCS#1二进制数据对象或DER编码的PKCS#7二进制数据对象。 必须在计算消息摘要之前,分配Contents值的空间。
Cert array or byte string (当SubFilter为adbe.x509.rsa_sha1时为必需)字节字符串数组,表示签署和验证使用公钥加密的签名时,使用的X.509证书链,如果证书链只有一个条目,则表示字节串。 签名证书应在数组中第一个元素,该证书用于验证内容中的签名值,其他证书用于验证签名证书的真实性。 如果SubFilter是adbe.pkcs7.detached或adbe.pkcs7.sha1,则不应使用此条目,并且证书链应放在Contents中的PKCS#7信封中。
ByteRange array (必需)一组整数对(起始字节偏移量,字节长度),它将描述摘要计算的确切字节范围。 应使用多个不连续的字节范围来描述不包含签名值(内容条目)的字节范围。
Reference array (可选; PDF 1.5)一组签名参考词典。
Changes array (可选)一个包含三个整数的数组,用于指定在先前签名和此签名之间对文档所做的更改:更改的页数、更改的域数量以及被填写的域数量。签名的顺序应由ByteRange的值决定。 由于每个签名都会导致增量保存,因此以后的签名具有更大的长度值。
Name text string (可选)签署文档的人员或机构的名称。 仅当无法从签名中提取名称时,才应使用此值。
M date (可选)签署时间。 根据签名处理程序,该值可能是正常的未验证计算机时间,或者是从安全时间服务器生成的可验证的时间。 仅当签名中签署时间不可用时,才应使用此值。
Location text string (可选)签名使用的CPU主机名或物理位置。
Reason text string (可选)签署的原因,例如(我同意…)。
ContactInfo text string (可选)签名者提供的联系方式,以使收件人能够联系签名者以验证签名。比如:电话号码。
R integer (可选)用于创建签名的签名处理程序的版本。 (PDF 1.5)不得使用此条目,并且该信息应存储在Prop_Build字典中。
V integer (可选; PDF 1.5)签名字典格式的版本。 如果Reference字典被认为对签名的验证至关重要,则该值为1。 默认值:0。
Prop_Build dictionary (可选; PDF 1.5)记录签名的计算机环境状态的信息的字典,例如:创建签名的处理程序的名称,软件构建日期,版本, 和PDF操作系统.PDF签名构建字典规范,提供了使用该字典的实现指南。
Prop_AuthTime integer (可选的;PDF 1.5)签名者最后认证后的秒数。如果值未知,则应省略。
Prop_AuthType name (可选; PDF 1.5)用于对签名者进行身份验证的方法。 有效值应为PIN,Password和Fingerprint。

Entries in a signature reference dictionary(签名参考字典中的条目)

key type value
Type name (可选)如果存在,则应为SigRef。
TransformMethod name (必需)转换方法的名称(请参见“转换方法”)。 有效值应为:DocMDP:用于检测文档相对于由文档创建者签名的签名字段的修改; 见“DocMDP”。UR:用于检测文档的修改,这些修改会使启用权限的文档中的签名无效; 见“UR。”FieldMDP:用于检测对TransformParams中指定的表单域列表的修改; 见“FieldMDP”。
TransformParams dictionary (可选)一个字典,指定TransformMethod指定的变换方法的变换参数(变量数据)。 每个方法都有自己的一组参数。
Data (various) (当TransformMethod为FieldMDP时为必需)执行对象修改分析的间接引用对象。 对于FieldMDP以外的变换方法,隐式定义此对象。
DigestMethod name (可选;需要PDF 1.5)标识计算摘要时使用的算名称。 有效值为MD5和SHA1。 默认值:MD5。

Transform Methods(变换方法)

变换方法以及变换参数,决定了包括和排除哪些对象。 以下子条款讨论了变换方法的类型,变换参数以及何时使用它们。

DocMDP

DocMDP转换方法应用于:检测相对于由文档作者(第一个签名的人)签名后对签名域的修改。 文档只能包含一个拥有DocMDP转换方法的签名域; 它应该是文件中第一个签名域。 它使作者能够指定允许对文档进行哪些更改是有效的,以及哪些更改使作者的签名无效。

如前所述,“MDP”代表修改检测和预防。 使用DocMDP转换方法的证书签名,可以检测哪些是作者指定的不允许的更改。 此外,当权限字典中的DocMDP条目引用签名字典时,也可以防止不允许的更改(请参阅“权限”)。

证书签名应指定一个合法证明字典(参见“法律内容证明”),该字典指定可能导致文档内容意外呈现的所有内容,以及作者对此类内容的证明。 如果质疑文档的完整性,则该字典应建立在作者的意图上。

DocMDP转换参数字典中的P条目应指示作者对文档的哪些更改将使签名无效。 (如果从权限字典中的DocMDP条目引用签名字典,也应防止对文档的这些更改。)P的值为1时,表示文档是不可以修改的; 也就是说,任何更改都将使签名无效。 值2和3,允许对表单域或comment workflows(注释工作流程)进行修改。

验证使用DocMDP转换方法的签名

要验证使用DocMDP转换方法的签名,应首先验证字节范围摘要。 然后,验证转换参数是否允许对文档进行哪些修改。

一旦验证了字节范围摘要,就知道ByteRange条目指定的文档部分相对于签名时文档的状态是否发生变化。

因此,可以比较文档的签名版本的PDF和当前版本的PDF,以判断是否对变换参数不允许的任何对象进行了修改。

Entries in the DocMDP transform parameters dictionary(DocMDP转换参数字典中的条目)

key type value
Type name (可选)如果存在,则应为TransformParams。
P number (可选)授予的访问权限。 有效值应为:1-不允许对文件进行任何更改; 对文件的任何更改都将使签名无效。2-允许的更改包括:填写表单,实例化页面模板和签名; 其他更改将使签名无效。3-允许的更改的内容包括2的部分,同时包括:注释的创建,删除和修改; 其他更改将使签名无效。默认值:2。
V name (可选)DocMDP转换参数字典版本。 唯一有效值应为1.2。 注意此值是名称对象,而不是数字。默认值:1.2。

UR

UR变换方法应用于检测文档的更改使得“使用权签名”无效,该签名是由权限字典中的UR3条目指定的(参见“权限”)。使用权签名告知哪些交互式功能是可用的,哪些是不可用的。 签名用于验证权限是否由真正的授权机构授予。 变换参数字典指定了签名有效时,应启用的附加权限。 由于文档在不允许的方式或被未被授予扩展权限的情况下,被修改导致签名无效,这时,其他权限不予授权。

UR3(PDF 1.6):首先,验证字节范围摘要,以确定ByteRange指定的文档部分是否与签名时文档的状态相一致。 接下来,检查文档的当前版本,判断是否对变换参数指定不允许修改的对象进行了修改。

Entries in the UR transform parameters dictionary(UR变换参数字典中的条目)

key type value
Type name (可选)如果存在,则应为TransformParams。
Document array (可选)名称数组,指定文档的附加文档的使用权限。 唯一定义的有效值为:FullSave,它允许修改的表单或注释数据进行保存。 (PDF 1.5)任何允许修改文档的使用权,都应启用FullSave权限。如果PDF文档包含UR3字典,则只允许修改文档的Annots条目指定的权限将隐式启用FullSave权限。 对于所有其他权限,应明确启用FullSave以保存文档。 (签名权应允许在签署过程中保存,但不允许保存)。
Msg text string (可选)可用于指定任意信息的文本字符串,例如向文档添加使用权的原因。
V name (可选)UR转换参数字典版本。 值应为2.2。 如果存在未知版本,则不应启用任何权限。注意:此值是名称对象,而不是数字。默认值:2.2。
Annots array (可选)名称数组,用于指定与注释相关的使用权限。 有效名称(PDF 1.5):Create, Delete, Modify,Copy, Import,和Export。仅当从权限字典的UR3条目引用签名字典时,才允许使用以下名称(PDF 1.6):Online-允许在线注释; 即:服务器上传或下载标记注释的能力。 SummaryView-允许显示一个用户界面,用于汇总文档中的注释(标记注释)。
Form array (可选)名称数组,指定表单域相关的使用权限。有效名称(PDF 1.5):Add - 允许用户将表单字段添加到文档中。Delete - 允许用户删除文档的表单域。FillIn-允许用户保存已完成表单填写的文档。Import - 允许用户以FDF、XFDF和文本(CSV / TSV)格式导入表单数据文件。Export - 允许用户将表单数据文件导出为FDF或XFDF。SubmitStandalone-允许用户在Web浏览器中未打开文档时提交表单数据。SpawnTemplate-允许从命名页面模板实例化新页面。仅当从权限字典的UR3条目引用签名字典时,才允许使用以下名称(PDF 1.6):BarcodePlaintext-允许(PDF 1.6)文本表单域数据被编码为明文二维条形码。Online-允许(PDF 1.6)特定的表单在线机制,如SOAP或Active Data Object。
Signature array (可选)名称数组,指定与签名相关的使用权限。 唯一定义的值应为Modify,表示:允许用户将数字签名应用于现有签名表单域或清除签名表单域。
EF array (可选; PDF 1.6)名称数组,用于指定文档中命名嵌入文件的使用权限。 有效名称应为Create,Delete,Modify和Import。
P boolean (可选; PDF 1.6)如果为true,则文档的权限应在所有被授权的应用程序中限制,同时允许此词典的其他条目启用对应权限。 默认值:false。

FieldMDP

FieldMDP转换方法应用于检测表单域值的更改。

Entries in the FieldMDP transform parameters dictionary(FieldMDP转换参数字典中的条目)

key type value
Type name (可选)如果存在,则应为TransformParams。
Action name (必需)一个名称,与Fields数组一起描述在应用签名后,哪些表单字段不允许更改。有效值应为:All - 所有表单域。Include - 仅包含在“Fields”中指定的表单域。Exclude - 仅在“Fields”中未指定的表单域。
Fields array (如果Include或Exclude操作,则为必需)包含域名称的文本字符串数组。
V name (可选:PDF 1.5则必需)转换参数字典版本。 PDF 1.5及更高版本的值应为1.2。 注意此值是名称对象,而不是数字。默认值:1.2。

FieldMDP签名验证方式与DocMDP签名类似。

数字签名的其他内容在下一章中展示。

你可能感兴趣的:(PDF分析)