PDF 加密解析:RC4 vs AES-128 vs AES-256
PDF 加密是施加于 PDF 内容流的密码学保护,使文件无法在没有密码的情况下被读取。PDF 规范在其历史上支持了多种算法,并非所有算法至今仍然安全。本页解释每种算法做什么、由哪个 PDF 版本引入,以及你今天保护文件时应选择哪个。
机制
PDF 加密如何工作
当 PDF 写入器加密一个文件时,它生成一个随机文件加密密钥,用该密钥加密内容流(以及文件中某些其他字符串),然后将文件加密密钥存储在由用户密码保护的加密字典中。要打开文件,查看器请求密码,从中派生一个密钥,用该密钥解密文件加密密钥,然后用文件加密密钥解密内容。
重要后果:密码不存储在文件中。存储的是用密码加密的值。要验证密码,查看器尝试解密该值并将结果与已知明文标记比对。这就是为什么不存在密码恢复 — 文件不包含密码,只包含被密码锁住的东西。
算法
RC4 — 已弃用且已被攻破
RC4 是 1987 年设计的流密码,在 1990 年代被广泛使用(PDF、SSL、WEP)。PDF 1.2 引入了 40 位 RC4;后续版本将其扩展到 128 位 RC4。RC4 现在在 PDF 中已弃用,并被视为对现代安全用途已被攻破。具体而言:
- 40 位 RC4 在现代硬件上可被平凡地暴力破解。
- 128 位 RC4 不可被暴力破解,但 RC4 有统计偏差会泄露明文信息,且已发表若干针对 RC4 加密 PDF 的实际攻击。
- 现代查看器在某些配置下会警告或拒绝打开 RC4 加密的文件。
不要创建新的 RC4 加密 PDF。如果遇到一个,解密它(用密码)并用 AES-128 或 AES-256 重新加密。
算法
AES-128 — 稳健、广泛支持
AES-128 在 PDF 1.5(2003,Acrobat 6/7)中引入。AES 是块密码;AES-128 使用 128 位密钥。PDF 的 AES 模式使用 CBC,每个字符串带一个随机 16 字节初始化向量。AES-128 没有针对它的实际攻击,并被每个现代 PDF 查看器广泛支持。当 AES-256 不可用时,它是一个合理的默认选择。
算法
AES-256 — 当前标准
AES-256 在 PDF 1.6 Extension Level 3(2008,Acrobat 9)中引入。它使用 256 位密钥,并在原始 PDF 1.6 Ext Level 3 设计中用 SHA-256 从密码派生密钥。后来的修订(PDF 2.0 / Extension Level 8)添加了更强的密钥派生,使用多次迭代的 PBKDF2,使暴力破解困难得多。这有时被称为"AES-256 R6"或"Acrobat X 兼容"。
只要你的工具提供,优先使用 AES-256。如果你可以在旧的和新的密钥派生之间选择,选新的(基于 PBKDF2 的)那个。
历史
哪个 PDF 版本引入了哪个算法
- PDF 1.2(1996) — 40 位 RC4。
- PDF 1.3(1999) — 128 位 RC4。
- PDF 1.5(2003) — AES-128(V4,R4)。
- PDF 1.6 Ext Level 3(2008) — AES-256(V5,R5)。
- PDF 2.0 / Ext Level 8(2017) — 带 PBKDF2 密钥派生的 AES-256(V5,R6)。
实践
选择哪个算法
对于新文件:带 PBKDF2 密钥派生(R6)的 AES-256,如果签名者和接收者查看器都支持;否则 AES-128。永远不要为新文件选择 RC4。密码比算法更重要:AES-256 上的 6 字符密码比 AES-128 上的 20 字符随机密码更弱,因为攻击面是密码,而非密码。
对于打开旧文件:任何现代查看器都能处理这三种。如果你能控制文件,解密并用 AES-256 重新加密。
一个有用的健全性检查:保护 PDF 后,尝试用与加密时不同的查看器打开它。如果第二个查看器可以无警告地打开它,加密就是广泛兼容的。如果只有原始工具能打开它,你可能使用了非标准模式。
IXPDF
IXPDF 当前的加密能力
继续阅读