如何检查PDF是否有任何类型的数字签名

Sam*_*isa 8 pdf digital-signature

我需要了解PDF是否有任何类型的数字签名.我必须管理巨大的 PDF,例如每个500MB,所以我只需要找到一种方法将非签名与签名分开(因此我只能将签名的PDF发送到管理它们的方法).到目前为止发现的任何程序都涉及尝试通过例如Bouncycastle libs(在我的情况下,对于Java)提取证书:如果它存在,则pdf被签名,如果它不存在或者引发异常,则不是(原文如此!).但这显然是时间/内存消耗,而不是资源浪费实现的一个例子.

是否有任何与语言无关的快速方式,例如打开PDF文件,读取第一个字节并查找告知文件已签名的信息?或者,是否有任何参考手册详细说明内部如何制作PDF?

先感谢您

dgv*_*ual 6

使用命令行,您可以使用 poppler-utils 包中的 pdfsig 工具检查文件是否具有数字签名(适用于 Ubuntu 20.04)。

pdfsig pdffile.pdf
Run Code Online (Sandbox Code Playgroud)

将生成包含有关签名和验证数据的详细数据的输出。如果您需要扫描 pdf 文件树并获取签名 pdf 列表,您可以使用 bash 命令,例如:

find ./path/to/files -iname '*.pdf'  \
-exec bash -c 'pdfsig "$0";  \
if [[ $? -eq 0 ]]; then  \
echo "$0" >> signed-files.txt; fi' {} \;
Run Code Online (Sandbox Code Playgroud)

您将在本地目录中的signed-files.txt 文件中获得签名文件的列表。

我发现这比尝试从 pdf 文件中 grep 一些文本要可靠得多(例如,立陶宛的签名服务生成的 pdf 不包含前面答案中提到的字符串“SigFlags”)。


Pat*_*lot 5

您将要使用PDF库而不是尝试自己实现这一点,否则您将陷入困境,处理线性化文档,过滤器,增量更新,对象流,交叉引用流等的变体.

关于参考资料; 根据我粗略的搜索,看起来Adobe不再向任何人提供ISO 32000:2008规范的版本,尽管该规范主要是将PDF v1.7参考手册翻译成符合ISO的语言.

因此,假设PDF v1.7参考,最相关的部分将是8.7(数字签名),3.6.1(文档目录)和8.6(交互式表单).

基本过程将是:

  1. 阅读文档目录中的"Perms"和"AcroForm"条目.
  2. 阅读'Perms'字典中的'DocMDP','UR'或'UR3'条目.如果存在这些条目,则在所有情况下,您都拥有经过认证的文档或启用了Reader的文档.
  3. 阅读'AcroForm'条目; (确保你没有'XFA'条目,因为用Porgy和Bess的Fraizer来说:Dat是一个并发症!).您基本上想要首先检查是否存在(可选)'SigFlags'条目,在这种情况下,非零值将指示Fields数组中存在签名.否则,您需要遍历"Fields"数组的每个条目,查找"FT"(字段类型)条目设置为"Sig"(签名)的字段字典,其中"V"(值)条目不是空值.

使用可以使用文档的交叉引用表来导航到正确的间接对象的PDF库应该比对证书的文档的强力搜索更快且资源更少.