PDF版式文档-数字签名规范

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

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

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

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

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

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(签名参考字典中的条目)

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转换参数字典中的条目)

Type    name    (可选)如果存在,则应为TransformParams。
P   number  (可选)授予的访问权限。 有效值应为:1-不允许对文件进行任何更改; 对文件的任何更改都将使签名无效。2-允许的更改包括:填写表单,实例化页面模板和签名; 其他更改将使签名无效。3-允许的更改的内容包括2的部分,同时包括:注释的创建,删除和修改; 其他更改将使签名无效。默认值:2。
V   name    (可选)DocMDP转换参数字典版本。 唯一有效值应为1.2。 注意此值是名称对象,而不是数字。默认值:1.2。
UR变换方法应用于检测文档的更改使得“使用权签名”无效,该签名是由权限字典中的UR3条目指定的(参见“权限”)。使用权签名告知哪些交互式功能是可用的,哪些是不可用的。 签名用于验证权限是否由真正的授权机构授予。 变换参数字典指定了签名有效时,应启用的附加权限。 由于文档在不允许的方式或被未被授予扩展权限的情况下,被修改导致签名无效,这时,其他权限不予授权。
UR3(PDF 1.6):首先,验证字节范围摘要,以确定ByteRange指定的文档部分是否与签名时文档的状态相一致。 接下来,检查文档的当前版本,判断是否对变换参数指定不允许修改的对象进行了修改。

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

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转换参数字典中的条目)

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先转换为字节流。
将整个PDF文件写入磁盘,并在签名字典中留有适当大小的空间(签名值保存的空间,ByteRange数组保存空间)。
ByteRange是一个包含四个数字的数组。 每对值中,第一个数字是:需要hash的字节流的开头位置(从头开始,从0开始)。 第二个数字是:该字节流的长度。 这两对定义了两个字节序列,用于定义要hash的内容。 签名值存储在第一个序列的结尾和第二个序列的开头之间的/Contents键中。 在下图,计算字节0到839和960到1200的哈希值。
根据文件中的偏移量知道签名值的位置后,将真实值以覆盖写方式写入ByteRange数组。 由于字节偏移量不得更改,因此新数组语句后面的额外字节将被零覆盖。
使用例如SHA-256之类的哈希算法,计算由ByteRange值指定的文档范围的哈希值。 注:Acrobat采用的方法是:对整个PDF文件进行哈希计算,而获得文档签名的哈希值(从字节0开始,以物理文件中的最后一个字节结束,但不包括签名值字节)。
计算出哈希值后,用签名者的私钥进行加密,并生成十六进制编码的PKCS#7对象签名对象。
签名对象作为/Contents的值,保存到文件中。 任何未用于签名对象的空间都将被零覆盖。
PDF文件将会被Acrobat重新加载,以确保内存和磁盘版本一致。
多次签名,采用增量更新的形式进行保存,才能保证前面签名的有效性。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据