博客

PBKDF2 vs Argon2:密钥派生函数如何选择

技术深潜 2026年5月27日 阅读时间 10 分钟

密钥派生函数的作用

人类记忆的密码和加密算法需要的密钥之间存在一道鸿沟:你的主密码可能是 "MyCat2024!",而 AES-256 需要的是一个 256-bit 的二进制密钥——形如 0x7f3b9c... 的 32 字节序列。

密钥派生函数(Key Derivation Function, KDF)就是这道鸿沟的桥梁。它接受一个可变长度的密码和一个随机盐值(salt),输出一个固定长度的密钥。关键的不是"转换"本身,而是这个转换过程的计算成本——KDF 必须足够慢,让攻击者无法在合理时间内暴力破解。

一个不安全的 KDF(如简单的 SHA-256 哈希)可以在现代 GPU 上每秒尝试数十亿次密码,而一个设计良好的 KDF 会将这个速度压低到每秒几千次甚至更低。

PBKDF2 的原理和工作方式

PBKDF2(Password-Based Key Derivation Function 2)由 RSA 实验室的 B. Kaliski 在 2000 年提出,定义在 RFC 2898 中。它的工作方式直截了当:

  • 将密码和盐值拼接,计算一次 HMAC(通常基于 SHA-256)。
  • 将上一次的输出作为输入再计算一次 HMAC。
  • 重复上述过程,迭代次数由参数指定。

迭代次数是 PBKDF2 的核心参数。100,000 次迭代意味着计算一个密钥需要执行 100,000 次 HMAC 操作。对于合法用户,解密时等待一次几百毫秒的延迟完全可以接受;但对于尝试数十亿密码的攻击者,这个成本就变得不可承受。

PBKDF2 的主要局限是:它的每一步运算都是纯 CPU 密集型的,对内存消耗极低。这意味着攻击者可以使用 GPU 或专用 ASIC 芯片并行计算大量候选密码,大幅降低单次尝试的有效成本。

Argon2 的原理和优势

Argon2 是 2015 年密码哈希竞赛(Password Hashing Competition)的获胜者,专门为抵抗 GPU 和 ASIC 暴力破解而设计。它与 PBKDF2 的根本区别在于:Argon2 不仅消耗 CPU 时间,还大量消耗内存。

Argon2 的核心优势:

  • 抗 GPU 并行:GPU 拥有大量核心但每个核心的内存极有限。Argon2 要求每次计算占用例如 64MB 内存,一块拥有 16GB 显存的 GPU 最多只能并行 256 次尝试,远低于 PBKDF2 下数万次的并行度。
  • 抗 ASIC:设计专用芯片攻击 PBKDF2 只需要计算单元和极少内存。而攻击 Argon2 需要在芯片上集成大量内存,制造成本呈指数级增长。
  • 可调参数:Argon2 提供三个可调参数——迭代时间(t)、内存消耗(m)、并行度(p),允许开发者根据目标平台精确平衡安全性与性能。

Argon2 分为两个变体:Argon2d(抗 GPU 更强)和 Argon2i(抗侧信道攻击更强)。Argon2id 结合了两者优势,是目前推荐使用的变体。

为什么 DeepSeal 选择 PBKDF2

既然 Argon2 在安全性上有明显优势,为什么 DeepSeal 仍然选择 PBKDF2?这个决定基于三个实际考量:

  • 跨平台兼容性:DeepSeal 需要在 macOS、Windows 和 Linux 三个平台上运行,并保持加密数据格式的互操作。PBKDF2 是几乎所有平台和语言的密码学库都原生支持的算法,而 Argon2 的原生支持在不同平台上参差不齐。引入 Argon2 意味着要么依赖第三方 C 库(增加构建复杂度和潜在的安全审计负担),要么用纯语言实现(性能无法保证)。
  • 经过 NIST 认证:PBKDF2 是 NIST SP 800-132 推荐的标准密钥派生函数。虽然 NIST 认证不代表绝对安全,但它意味着经过了广泛的安全审查和长期的实战验证。对于一款加密产品来说,选择被广泛审查的算法是一种保守但负责任的做法。
  • 100K 迭代在现代硬件上足够安全:PBKDF2-SHA256 在 100,000 次迭代下,单次派生在消费级 CPU 上需要约 100-200ms。以最常见的弱密码(8 位字母数字)为例,攻击者使用单块 RTX 4090 GPU 的暴力破解速度约为每秒 150 万次尝试,破解一个 8 位字母数字密码仍需约 600 年。对于大多数个人用户的威胁模型,这是足够的。

未来可能迁移到 Argon2 的条件

我们没有排除未来迁移到 Argon2 的可能性。迁移条件包括:

  • 主流操作系统和密码学库(如 WebCrypto API、System Security.framework、CommonCrypto)原生支持 Argon2id。
  • GPU 计算能力的增长使 PBKDF2 在合理迭代次数下的安全裕度显著降低。
  • 出现可靠的跨平台 Argon2 绑定库,经过独立安全审计。

迁移时,我们会在数据库中记录每条记录使用的 KDF 类型,支持 PBKDF2 和 Argon2 并存,用户修改密码时自动升级到 Argon2,无需一次性迁移所有数据。

安全是持续演进的过程,不是一次性的选择。当条件成熟时,我们会毫不犹豫地升级。