跳转到主要内容

PBKDF2

本文约需 2 分钟阅读

PBKDF2 (Password-Based Key Derivation Function 2) 是用于从密码安全地导出加密密钥的函数。通过将哈希函数反复应用数万至数十万次来提高计算成本,从而对抗暴力破解攻击。 2000 年由 RSA Laboratories 作为 PKCS #5 v2.0 公开,并在 NIST SP 800-132 中标准化。它是被广泛系统采用、历史悠久的算法,例如 Wi-Fi 的 WPA2 和 macOS 的磁盘加密。

历史背景

PBKDF2 的前身 PBKDF1 于 1993 年在 PKCS #5 v1.5 中定义,但存在可导出密钥长度受限于哈希函数输出长度的问题。 2000 年公开的 PBKDF2 取消了这一限制,使得可以导出任意长度的密钥。 2010 年它作为 NIST SP 800-132 被正式标准化,甚至在美国政府的系统中也开始被推荐使用。尽管它拥有悠久的历史和广泛的采用实绩,但随着 GPU 的发展,其安全性的局限也逐渐被指出。

基于 HMAC 的迭代计算

PBKDF2 的内部结构很简单。它以密码和作为输入,反复应用 HMAC (Hash-based Message Authentication Code)。

密码 + 盐
HMAC-SHA256 (第 1 次)
HMAC-SHA256 (第 2 次)
... × 600,000 次
导出密钥

将每次迭代的输出用 XOR 累积,生成最终的密钥。截至 2025 年,OWASP 推荐使用 HMAC-SHA256 进行 600,000 次以上的迭代。使用 HMAC-SHA512 时,推荐 210,000 次以上。

Wi-Fi WPA2 中的采用

PBKDF2 最贴近日常的使用例子是 Wi-Fi 的 WPA2-Personal (WPA2-PSK)。在从 Wi-Fi 密码 (PSK: Pre-Shared Key) 导出实际加密密钥时,使用了迭代 4,096 次的 PBKDF2-HMAC-SHA1。这一迭代次数在 2004 年制定时是合理的,但以现在的 GPU 性能每秒可进行数十万次尝试,短密码会在现实的时间内被破解。 WPA3 已转向 SAE (Simultaneous Authentication of Equals),从而解决了这一问题。

现代的局限

PBKDF2 最大的弱点在于其计算是 CPU 密集型且几乎不消耗内存。 GPU 拥有数千个运算核心,能够大量并行执行像 HMAC-SHA256 这样的简单计算。截至 2025 年的高性能 GPU (如 NVIDIA RTX 4090) 即使对 PBKDF2-HMAC-SHA256 进行 600,000 次迭代,每秒也能尝试数万个密码候选。

特性PBKDF2bcryptscryptArgon2id
出现年份2000199920092015
内存困难
GPU 抗性中等
NIST 标准化SP 800-132RFC 7914RFC 9106
OWASP 推荐排名第 4 位 (遗留)第 2 位第 3 位第 1 位

迁移的实务

在使用 PBKDF2 的现有系统中,通常采用在用户下次登录时用 Argon2id 或 bcrypt 重新哈希的渐进式迁移。在迁移密码哈希时,需要采用同时保留旧哈希和新哈希、在所有用户迁移完成之前对两者都进行验证的设计。从密钥管理的角度来看,这也是重新审视导出密钥的用途和保存方式的好时机。

“我们用 6 个月时间完成了从 PBKDF2 到 Argon2id 的迁移。通过采用登录时重新哈希的方式,并在迁移期间对两种哈希都进行验证,最终在对用户零影响的情况下完成了迁移。”

密码学的基础在加密的基础中讲解,密码管理的整体概况在安全的密码管理指南中讲解。关于后量子时代的密码安全,也请参考后量子密码安全密码技术专业书 (Amazon)可以更深入地学习。

常见的误解

有一种误解认为「因为 NIST 已将 PBKDF2 标准化,所以它最安全」,但标准化是对兼容性的保证,而非对安全性的保证。 NIST 自身也在 SP 800-63B 中推荐使用内存困难函数,PBKDF2 的定位接近「可接受的最低底线」。此外,「只要增加迭代次数就也能对抗 GPU」这一想法也是错误的,因为 GPU 能够并行执行与 CPU 相同的 HMAC 计算,增加迭代次数会对正规用户和攻击者双方产生同等影响。

相关术语

这篇文章对您有帮助吗?

XHatena