pdf - 如何使用静态工具检查 PDF 是否受密码保护

标签 pdf passwords

我已经看到有关此主题的多个问题。在答案中,用户必须使用一些 pdf 库或内置支持加载 pdf,然后根据库函数,用户可以确定 pdf 是否已加密。我很想知道是否可以使用一些静态分析工具来检测加密的 PDF,即 YARA,在那里我们只将文件内容作为二进制/字符串数据读取,而不是文件的完整结构?

最佳答案

根据 Adob​​e PDF (v.1.7) 引用手册(表 3.13)的第 3.4.4 节,PDF 加密在 File Trailer 字典中带有一个加密条目。

因此,要检测 PDF 加密,请转到文件末尾并向上搜索仅包含单词“trailer”的第一行,然后再次向下搜索字符串“/Encrypt”。如果存在,则文件已加密,否则不加密。

现在,检测 PDF 是否受密码保护,这意味着您无法在不提供密码的情况下打开它,这将变得更加困难。您基本上需要在/Encrypt 键(例如 '14 0 R')之后读取对象引用,跳转到文件的开头并搜索该对象(例如 '14 0 obj <<')并查找/Filter 、/R 和/U 字典中的键。

如果/Filter 值为/Standard,则
根据算法 3.6“验证用户密码”(第 127 页)的序言,算法 3.6 可用于确定用户密码是否为空字符串,从而确定是否禁止提示输入密码。

所以基本上,如果/R 值为 2,您将查找/U 值作为特定字符串,如果/R 值为 3 或 4,您可以查找/U 值作为另一个特定字符串,如果这两个值都不是,则需要用户密码才能打开文档,并且文档受密码保护。

您可以按照 PDF 引用中的算法计算这些/U 值,或者您可以从不需要密码才能打开的现有加密 PDF 中挖掘它们。

关于pdf - 如何使用静态工具检查 PDF 是否受密码保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35594240/

相关文章:

java - response.sendRedirect 应在新窗口中打开

java - PDF/A 的复选框 - iText 2.1.7

linux - linux上的登录时间问题

mysql - 存储双向密码最安全的方法是什么?

c# - 生成随 secret 码

java - 检索此创建的 PDF 文件的页数的更智能解决方案是什么?

java - 自动将 USB token 中的签名导入到 PDF 中?

ruby-on-rails - 使用Devise重置密码问题

python - 我怎样才能在 python 中阅读 pdf?

swift - 如何使用 Swift 在 Firebase 中对密码进行哈希处理?