数字签名(PDF 1.3)可用于验证用户的身份和文档的内容。 它在签名时,保存了有关签名者和文档状态的信息。
签名可以是纯数学的,例如公钥/私钥加密文档摘要,也可以是生物识别形式的,例如手写签名,指纹或视网膜扫描。
ISO 32000中的数字签名目前支持两种活动:一、向文档添加数字签名,二、检查该签名的有效性。 撤销信息是签名的一个属性,这意味着签名时,必须在签名之前先获取吊销信息。 类似的要求也适用于证书链,签名软件必须在签名之前获取并验证证书链。
签名信息保存在签名字典中。签名处理程序可以使用或省略(被标记为可选的条目,但如果被设置为标准方式,则要使用它们)。
此外,签名处理程序可以添加自己的私有条目。 为避免名称重复,所有此类私有条目的键,应以注册的处理程序名称为前缀,后面跟上句点符号(2Eh)。
通过计算文档中数据(或部分数据)作为摘要,并将摘要存储在文档中来创建签名。 为了验证签名,应重新计算摘要并将其与存储在文档中的摘要进行比较。 摘要值如果存在差异,则表明文档签署后,已进行了修改。
有两种定义的技术用于计算PDF文件的全部或部分内容的数字签名:
PDF文档可以包含以下几种标准类型的签名:
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。 |
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。 |
变换方法以及变换参数,决定了包括和排除哪些对象。 以下子条款讨论了变换方法的类型,变换参数以及何时使用它们。
DocMDP转换方法应用于:检测相对于由文档作者(第一个签名的人)签名后对签名域的修改。 文档只能包含一个拥有DocMDP转换方法的签名域; 它应该是文件中第一个签名域。 它使作者能够指定允许对文档进行哪些更改是有效的,以及哪些更改使作者的签名无效。
如前所述,“MDP”代表修改检测和预防。 使用DocMDP转换方法的证书签名,可以检测哪些是作者指定的不允许的更改。 此外,当权限字典中的DocMDP条目引用签名字典时,也可以防止不允许的更改(请参阅“权限”)。
证书签名应指定一个合法证明字典(参见“法律内容证明”),该字典指定可能导致文档内容意外呈现的所有内容,以及作者对此类内容的证明。 如果质疑文档的完整性,则该字典应建立在作者的意图上。
DocMDP转换参数字典中的P条目应指示作者对文档的哪些更改将使签名无效。 (如果从权限字典中的DocMDP条目引用签名字典,也应防止对文档的这些更改。)P的值为1时,表示文档是不可以修改的; 也就是说,任何更改都将使签名无效。 值2和3,允许对表单域或comment workflows(注释工作流程)进行修改。
要验证使用DocMDP转换方法的签名,应首先验证字节范围摘要。 然后,验证转换参数是否允许对文档进行哪些修改。
一旦验证了字节范围摘要,就知道ByteRange条目指定的文档部分相对于签名时文档的状态是否发生变化。
因此,可以比较文档的签名版本的PDF和当前版本的PDF,以判断是否对变换参数不允许的任何对象进行了修改。
key | type | value |
---|---|---|
Type | name | (可选)如果存在,则应为TransformParams。 |
P | number | (可选)授予的访问权限。 有效值应为:1-不允许对文件进行任何更改; 对文件的任何更改都将使签名无效。2-允许的更改包括:填写表单,实例化页面模板和签名; 其他更改将使签名无效。3-允许的更改的内容包括2的部分,同时包括:注释的创建,删除和修改; 其他更改将使签名无效。默认值:2。 |
V | name | (可选)DocMDP转换参数字典版本。 唯一有效值应为1.2。 注意此值是名称对象,而不是数字。默认值:1.2。 |
UR变换方法应用于检测文档的更改使得“使用权签名”无效,该签名是由权限字典中的UR3条目指定的(参见“权限”)。使用权签名告知哪些交互式功能是可用的,哪些是不可用的。 签名用于验证权限是否由真正的授权机构授予。 变换参数字典指定了签名有效时,应启用的附加权限。 由于文档在不允许的方式或被未被授予扩展权限的情况下,被修改导致签名无效,这时,其他权限不予授权。
UR3(PDF 1.6):首先,验证字节范围摘要,以确定ByteRange指定的文档部分是否与签名时文档的状态相一致。 接下来,检查文档的当前版本,判断是否对变换参数指定不允许修改的对象进行了修改。
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转换方法应用于检测表单域值的更改。
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签名类似。
数字签名的其他内容在下一章中展示。