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

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

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

preview

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:

 

preview

Content Type有6种:

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

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

preview

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的结构如下:

preview

 其中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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android zip文件读写,如何直接从.zip文件中读取文件而不在android中提取它

我过去几个月一直在研究android,现在我的问题是读取放在SD卡上的.zip文件.我已经成功完成了在SD卡上下载.zip文件的编码.我有img.zip文件下载到SD卡上.这个img.zip包含5个图像文件.现在我可以直接阅读其内容而不是解压缩img.zip …… ???如果是的话请帮忙.我在互联网上看到了…

jQuery的radio,checkbox,select操作

获取一组radio被选中项的值 var item $(input[nameitems][checked]).val(); 获取select被选中项的文本 var item $("select[nameitems] option[selected]").text(); select下拉框的第二个元素为当前选中值 $(#select_id)[0].selectedIndex 1; radio单选组的第二个…

数字签名时间戳服务器的原理

时间戳服务工作流程: ◆ 用户对文件数据进行Hash摘要处理; ◆ 用户提出时间戳的请求,Hash值被传递给时间戳服务器; ◆ 时间戳服务器对哈希值和一个日期/时间记录进行签名,生成时间戳; ◆ 时间戳数据和文…

android x86 笔记本卡屏,笔记本死机卡屏怎么办

笔记本死机卡屏的解决方法:首先按住键盘上ctrlaltdel,弹出任务管理器;然后在弹出任务管理器中选择explorer.exe;接着右键点击explorer.exe,在弹出菜单中选择“结束进程”;最后输如explorer.exe即可。首先&a…

scrapy 伪装代理和 fake_userAgent 的使用

From:https://www.cnblogs.com/hellangels333/p/8918938.html fake-useragent 下载 和 使用方法:https://pypi.org/project/fake-useragent 伪装浏览器代理 在爬取网页是有些服务器对请求过滤的不是很高可以不用ip来伪装请求直接将自己的浏览器信息给伪…

readyState的五种状态详解【转】

在《Pragmatic Ajax A Web 2.0 Primer 》中偶然看到对readyStae状态的介绍,感觉这个介绍很实在,摘译如下: 0: (Uninitialized) the send( ) method has not yet been invoked. 1: (Loading) the send( ) method has been invoked, request i…

【读书笔记】《框架设计(第2版)CLR Via C#》中两个比较有趣的知识点

本季度公司要求阅读《框架设计(第2版)CLR Via C#》这本书,由于前两个月一直很忙,也没有时间阅读,偶尔阅读也是很晚回家以后临睡前拿起这经典之作读那么一个小节。最近利用周末可以说一鼓作气的看了大半本,感…

Python 使用 Scrapy 发送 post 请求的坑

From:https://www.jb51.net/article/146769.htm 使用 requests 发送 post 请求 先来看看使用requests来发送post请求是多少好用,发送请求 Requests 简便的 API 意味着所有 HTTP 请求类型都是显而易见的。 例如,你可以这样发送一个 HTTP POST …

Effective Java~46. 优先选择Stream 中无副作用的函数

纯函数&#xff08;pure function&#xff09;的结果仅取决于其输入&#xff1a;它不依赖于任何可变状态&#xff0c;也不更新任何状态。 坏味道 // Uses the streams API but not the paradigm--Dont do this! Map<String, Long> freq new HashMap<>(); try (S…

android applybatch,android – 使用applyBatch插入成千上万的联系人条目很慢

我正在开发一个应用程序&#xff0c;我需要插入大量的联系人条目。在当前时间约600个联系人&#xff0c;共有6000个电话号码。最大的联系人有1800个电话号码。截至今天的状态是&#xff0c;我创建了一个自定义帐户来保存联系人&#xff0c;因此用户可以选择在联系人视图中查看联…

[译]How to make searching faster

Here are some things to try to speed up the seaching speed of your Lucene application. Please see ImproveIndexingSpeed for how to speed up indexing. 以下是一些尝试提高lucene程序检索速度的方法. 如果需要提高索引速度,请看提高索引速度. Be sure you really need …

8个最高效的Python爬虫框架,你用过几个?

From&#xff1a;https://segmentfault.com/a/1190000015131017 1.Scrapy Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘&#xff0c;信息处理或存储历史数据等一系列的程序中。。用这个框架可以轻松爬下来如亚马逊商品信…

android oreo 源码,android – Oreo:如何在源代码中找到所有受限制的系统调用?

哪些Syscalls在Android 8.0 Oreo中受限制&#xff1f;编辑&#xff1a;Syscall过滤背景过滤本身是Linux内核提供的标准功能,称为seccomp.所有AOSP都使用此功能来过滤上面链接的应用黑名单中列出的系统调用.脚本处理将黑名单列入特定于平台的自动生成过滤器,然后将其提供给secco…

Effective Java~57. 将局部变量的作用域最小化

优先选择 for 循环而不是 while 循环 例如&#xff0c;下面是遍历集合的首选方式 // Preferred idiom for iterating over a collection or array for (Element e : c) { ... // Do Something with e } 如果需要在循环中调用 remove 方法&#xff0c;首选传统的 for 循环代…

300+Jquery, CSS, MooTools 和 JS的导航菜单资源

如果你是网站前端开发人员&#xff0c;那么对你来说&#xff0c;也许做一个漂亮导航菜单会很得心应手。本文要为大家总结各种导航菜单的资源&#xff0c;以便让大家的网站前端开发的工作更方便更快速&#xff0c;只要选择现成的例子就可以应用于自己的网站了。本文收集的这些资…

轻量级分布式任务调度平台 XXL-JOB

From&#xff1a;https://www.cnblogs.com/xuxueli/p/5021979.html github 地址 及 中文文档地址&#xff1a;https://github.com/xuxueli/xxl-job 《分布式任务调度平台XXL-JOB》 一、简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发…

畅玩4c刷android 9.0,华为畅玩4C电信版 CyanogenMod 13.0_Android_6.0.1 【HRT_chiwahfj】

本帖最后由 chiwah渔夫 于 2016-9-9 22:31 编辑【基本信息】ROM名称&#xff1a;华为畅玩4C电信版 CyanogenMod 13.0_Android_6.0.1ROM大小&#xff1a;617M适配版本&#xff1a;CyanogenMod 13.0_android_6.0.1测试机型&#xff1a;华为畅玩4C电信版作者简介&#xff1a;HRT团…

Effective Java~58. for-each 循环优先于传统的for 循环

传统的 for循环来遍历一个集合: // Not the best way to iterate over a collection! for (Iterator<Element> i c.iterator(); i.hasNext(); ) { Element e i.next();... // Do something with e } 迭代数组的传统 for 循环的实例 // Not the best way to iterate …

近期课余目标

http://acm.pku.edu.cn/JudgeOnline/ 按这个顺序做&#xff0c; 这些都是入门的水题 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算…

html语言鼠标悬停特效,CSS3鼠标悬停文字幻影动画特效

这是一款CSS3鼠标悬停文字幻影动画特效。该特效利用before和after伪元素来制作当鼠标悬停在超链接文本上的时候的幻影效果。使用方法在页面中引入bootstrap.css、jquery和photoviewer.js文件。HTML结构在页面中添加一个元素&#xff0c;并设置它的data-hover属性和它的显示文字…