来源:PDF签名系列(2):PDF的签名值到底存在哪里? - 知乎

研究过PDF签名的同学应该见过下面这张图, 来自ADOBE的文档Acrobat_DigitalSignatures_in_PDF.pdf

PDF被签名的内容是整个文档除去signature dictionary里/Contents下面的内容. 签过名的哈希值再连同其他一些信息一起写进/Contents里. 也就是说/Contents内容以外的部分一旦被修改, 签名就无法验证通过了.

但是这张图容易误导我们的地方是, 我们会以为签名值就是一个由证书, 签名哈希, 时间戳组成的list. 而且"Signature value"也容易与SignerInfo里的Signature Value混淆.

其实, /Contents下面的真正内容是一个DER编码的PKCS#7数据对象, 通常我们称它为一个PKCS#7 container.

所以下面稍微详细解析一下PKCS#7格式, 它跟CMS几乎是一样的, 可以把二者看成一个统一的概念. PKCS#7需要符合RFC3852/RFC5652的标准.

CMS是加密消息语法, 它并不是一个专为数字签名而定制的标准, 它定义了一个对象ContentInfo, 包含Content Type和Content:

Content Type有6种:

  • Data,
  • Signed-data,
  • Enveloped-data,
  • Digested-data,
  • Encrypted-data
  • Authenticated-data

对于数字签名来说, 属于Signed-data类型. ContentInfo里的content是一个SignedData类型:

SignedData包含一个EncapsulatedContentInfo, 存的是待签名的原文内容. 我们已经知道,对原文的签名其实是对原文摘要的加密, 如果把原文内容放进这里, 签名值有可能会变得很大, 签完名的文档的大小就翻了倍. 一般来说, 会把EncapsulatedContentInfo空着, 这就是detached signature. 这跟通常意义上的跟Embedded signature相对的detached signature不是一个概念. Embedded Signature的意思是把一个文档的签名值嵌入文档中成为一个文件, 相对的, detached signature是把文档的签名值和文档分开保存. 对于CMS中的detached signature的概念则是另外一回事, 明白了这个也就明白了, SubFilter里的值为adbe.pkcs7.detached的原因.

SignedData里还包含了SignerInfos, 可以为每个签名者创建一个独立的SignerInfo, 也就是说CMS是支持多人平行签名(Parallel Signature)的. 但是PDF只支持增量签名(Incremental Signature), 也就是后一个签名版本是前一个签完名的文档加上文档的更新内容. 见下图

具体可以参考Acrobat_DigitalSignatures_in_PDF.pdf.

SignerInfo的结构如下:

其中SignerIdentifier是签名者的证书信息, DigestAlgorithmIdentifier是该签名者使用的摘要算法标识, SignatureAlgorithmIdentifier是该签名者使用的签名算法, SignedAttributes和UnsignedAttributes是一些属性, SignatureValue就是真正的签名值了!

SignedAttributes是需要签名的属性, 是Optional的. 如果为空, 那么SignatureValue就直接是原文内容的签名值了. 如果SignedAttributes不为空, 那么至少要包含两个Attibutes:

也就是说至少要把原文数据的content type和消息摘要包含进去, 然后加上别的需要签名的属性, 例如revocation information, 对SignedAttributes做哈希和加密, 产生的签名值作为SignatureValue. 所以这种情况下是要做两次哈希的, 第一次是原文的哈希, 第二次是对SignedAttributes做哈希.

至此, 我们从PDF的signature dictionary结构深入到PKCS#7结构里的找到了签名值的位置. 下面打算继续研究MIME, ESS等内容以及它们与CMS的关系.

补充:

ESS - The ESS signing-certificate-v2 attribute是第三个必须要包含在Signed attributes中的属性.

S/MIME - 邮件中的CMS object

参考文档:

Acrobat_DigitalSignatures_in_PDF.pdf

RFC5652-Cryptographic Message Syntax (CMS)

PDF Signature digest

Message digest of pdf in digital signature

PDF签名系列(2):PDF的签名值到底存在哪里?相关推荐

  1. PDF签名系列(1):PDF签名机制的漏洞分析

    来源:PDF签名系列(1):PDF签名机制的漏洞分析 - 知乎 研究PDF文件的签名机制有一段时间了,刚开始学习的时候就看到有提到说,被签名的PDF内容的Range gap,会成为这个机制的漏洞,但是 ...

  2. 什么是计算机系统的可信基点,基于可信基点的结构化签名比较算法.pdf

    基于可信基点的结构化签名比较算法.pdf 第28卷 第24期 计算机工程与设计 21)07年12月 VO1.28 NO.24 Computer Engineering and Design Dec.2 ...

  3. 【每日随笔】电子签名 ( 下载 “e 签保“ 应用 | 使用 手机号 + 短信验证码 登录 | 发起签署 | 签名 | 获取签名后的 PDF 文件及出证信息 )

    文章目录 一.下载 "e 签保" 应用 二.使用 手机号 + 短信验证码 登录 三.发起签署 四.签名 五.获取签名后的 PDF 文件及出证信息 一.下载 "e 签保&q ...

  4. java读取pdf签名_Java 获取PDF中的数字签名信息

    一.概述及程序环境要求 本文以Java代码演示如何获取PDF文档中的数字签名信息,包括签名人.签名位置.日期.原因.联系方式.签名在文档中的坐标等等. 程序环境包括: Spire.Pdf.jar(ja ...

  5. Java实现图章或签名插在pdf的固定位置

    提示:使用Java技术在word转换成pdf过程中实现将图章或者签名插入在pdf中,并生成带图章或者签名的pdf 文章目录 前言 一.引入pom依赖 二.编写插入图章或者签名位置的类 三.编写插入图章 ...

  6. 解决pdf.js预览pdf不显示签名问题(两条路)

    解决pdf.js预览pdf不显示签名问题(两条路) 解决这个问题的方法很有意思,解决这一类问题的思路就是:如何不让pdf.js抛出异常或者警告.[其实乍一看好像和问题本身并不沾边,哈哈] 电子签章不显 ...

  7. Adobe Reader 文档无法签名_手把手教你如何利用PDF阅读器压缩PDF文档

    众所周知,PDF格式文本.格式.字体.颜色.分辨率.链接及图形图像.声音.动态影像等所有的信息封装在一个特殊的整合文件中.这个优点也导致我们工作学习上接触到的PDF文档体积都不小,非常影响阅读体验和邮 ...

  8. 九十七、轻松搞定Python中的PDF办公自动化系列

    @Author:Runsen @Date:2020/7/15 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  9. 【c#系列】PDF进行操作-浏览、分割、合并、插入、删除(1)

    工作所需,需要对PDF进行浏览,分割.插入.删除和合并等功能,并不需要其它多余的功能,一番搜索后,利用开源代码,终于实现了简单的操作,把开发流程进行的简单记录以备不时之需. 先预览一下: 一.开发环境 ...

最新文章

  1. showModalDialog 传值及刷新
  2. JavaScript 日期联动选择器
  3. python的字符串的转义
  4. 后退返回命令数量_Redis | Redis 有序集合相关命令
  5. mongoose --- createUser
  6. iOS笔记之UIKit_UINavigationController
  7. 计算机应用能力考试ppt,计算机应用能力考试题库
  8. oracle中12523,【Oracle】静态监听导致的ORA-12523错误
  9. c++画多边形_如何画出超漂亮的极光绘画教程
  10. Jeecg-Boot 1.0 版本发布,基于SpringBoot+Mybatis+AntDesign快速开发平台
  11. Java Web学习笔记08:分页技术
  12. python和java哪个好-现在Java和Python哪个前景更好?
  13. ActiveMQ(4) ActiveMQ JDBC 持久化 Mysql 数据库
  14. Linux命令之解压缩:tar、zip、rar 命令
  15. 计算几何(一) by 邓俊辉老师
  16. MathPage.wll not found
  17. 贴图平移凹凸贴图偏移
  18. Oculus Rift-S 安装
  19. AndroidStudio安装apk到vivo手机时提示安装失败
  20. 转]udev实现原理(含检测U盘拔插例子)检测热插拨 (hotplug)

热门文章

  1. 小乖乖专属-从数据库里查信息发邮件
  2. 永久解决word2016安装Mathtype后无法复制粘贴问题,且不影响Mathtype加载到Word(附mathtype7安装包)
  3. 电脑横屏和竖屏双屏幕设置不一样的壁纸
  4. 7 个Javascript 小技巧
  5. 论文笔记32 -- Conformer: Local Features Coupling Global Representations for Visual Recognition
  6. usage.txt-1
  7. python爬取高德地图_爬虫实战:如何爬取高德地图?
  8. Cucumber之二Gherkin语言学习
  9. C#,骑士游历问题(Knight‘s Tour Problem)的恩斯多夫(Warnsdorff‘s Algorithm)算法与源代码
  10. 小米如何使用远程管理FTP操作电脑和手机的文件