PDF签名系列(2):PDF的签名值到底存在哪里?
来源: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的签名值到底存在哪里?相关推荐
- PDF签名系列(1):PDF签名机制的漏洞分析
来源:PDF签名系列(1):PDF签名机制的漏洞分析 - 知乎 研究PDF文件的签名机制有一段时间了,刚开始学习的时候就看到有提到说,被签名的PDF内容的Range gap,会成为这个机制的漏洞,但是 ...
- 什么是计算机系统的可信基点,基于可信基点的结构化签名比较算法.pdf
基于可信基点的结构化签名比较算法.pdf 第28卷 第24期 计算机工程与设计 21)07年12月 VO1.28 NO.24 Computer Engineering and Design Dec.2 ...
- 【每日随笔】电子签名 ( 下载 “e 签保“ 应用 | 使用 手机号 + 短信验证码 登录 | 发起签署 | 签名 | 获取签名后的 PDF 文件及出证信息 )
文章目录 一.下载 "e 签保" 应用 二.使用 手机号 + 短信验证码 登录 三.发起签署 四.签名 五.获取签名后的 PDF 文件及出证信息 一.下载 "e 签保&q ...
- java读取pdf签名_Java 获取PDF中的数字签名信息
一.概述及程序环境要求 本文以Java代码演示如何获取PDF文档中的数字签名信息,包括签名人.签名位置.日期.原因.联系方式.签名在文档中的坐标等等. 程序环境包括: Spire.Pdf.jar(ja ...
- Java实现图章或签名插在pdf的固定位置
提示:使用Java技术在word转换成pdf过程中实现将图章或者签名插入在pdf中,并生成带图章或者签名的pdf 文章目录 前言 一.引入pom依赖 二.编写插入图章或者签名位置的类 三.编写插入图章 ...
- 解决pdf.js预览pdf不显示签名问题(两条路)
解决pdf.js预览pdf不显示签名问题(两条路) 解决这个问题的方法很有意思,解决这一类问题的思路就是:如何不让pdf.js抛出异常或者警告.[其实乍一看好像和问题本身并不沾边,哈哈] 电子签章不显 ...
- Adobe Reader 文档无法签名_手把手教你如何利用PDF阅读器压缩PDF文档
众所周知,PDF格式文本.格式.字体.颜色.分辨率.链接及图形图像.声音.动态影像等所有的信息封装在一个特殊的整合文件中.这个优点也导致我们工作学习上接触到的PDF文档体积都不小,非常影响阅读体验和邮 ...
- 九十七、轻松搞定Python中的PDF办公自动化系列
@Author:Runsen @Date:2020/7/15 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...
- 【c#系列】PDF进行操作-浏览、分割、合并、插入、删除(1)
工作所需,需要对PDF进行浏览,分割.插入.删除和合并等功能,并不需要其它多余的功能,一番搜索后,利用开源代码,终于实现了简单的操作,把开发流程进行的简单记录以备不时之需. 先预览一下: 一.开发环境 ...
最新文章
- showModalDialog 传值及刷新
- JavaScript 日期联动选择器
- python的字符串的转义
- 后退返回命令数量_Redis | Redis 有序集合相关命令
- mongoose --- createUser
- iOS笔记之UIKit_UINavigationController
- 计算机应用能力考试ppt,计算机应用能力考试题库
- oracle中12523,【Oracle】静态监听导致的ORA-12523错误
- c++画多边形_如何画出超漂亮的极光绘画教程
- Jeecg-Boot 1.0 版本发布,基于SpringBoot+Mybatis+AntDesign快速开发平台
- Java Web学习笔记08:分页技术
- python和java哪个好-现在Java和Python哪个前景更好?
- ActiveMQ(4) ActiveMQ JDBC 持久化 Mysql 数据库
- Linux命令之解压缩:tar、zip、rar 命令
- 计算几何(一) by 邓俊辉老师
- MathPage.wll not found
- 贴图平移凹凸贴图偏移
- Oculus Rift-S 安装
- AndroidStudio安装apk到vivo手机时提示安装失败
- 转]udev实现原理(含检测U盘拔插例子)检测热插拨 (hotplug)
热门文章
- 小乖乖专属-从数据库里查信息发邮件
- 永久解决word2016安装Mathtype后无法复制粘贴问题,且不影响Mathtype加载到Word(附mathtype7安装包)
- 电脑横屏和竖屏双屏幕设置不一样的壁纸
- 7 个Javascript 小技巧
- 论文笔记32 -- Conformer: Local Features Coupling Global Representations for Visual Recognition
- usage.txt-1
- python爬取高德地图_爬虫实战:如何爬取高德地图?
- Cucumber之二Gherkin语言学习
- C#,骑士游历问题(Knight‘s Tour Problem)的恩斯多夫(Warnsdorff‘s Algorithm)算法与源代码
- 小米如何使用远程管理FTP操作电脑和手机的文件