0Pricing
Cloud & IT Cert Prep · 课时

密钥派生函数:PBKDF2、bcrypt 与 Argon2

根据密码哈希算法抵御 GPU 和 ASIC 攻击的能力进行比较,并了解如何调整计算成本和内存难度。

密钥派生函数:PBKDF2、bcrypt 与 Argon2 是 CoddyKit 上的免费 Cloud & IT Cert Prep 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cloud & IT Cert Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cloud & IT Cert Prep 课程共包含 4 节课。

密码哈希为何不同

存储密码需要使用一种特殊的密码学函数,称为密码哈希函数(PHF)或密钥派生函数(KDF)。SHA-256 等常规密码学哈希函数的设计目标是高速运行——现代 GPU 每秒可以计算数十亿个 SHA-256 哈希值。对于密码存储而言,这种速度会造成灾难性后果:攻击者一旦窃取哈希数据库,就可以每秒尝试数十亿个密码猜测。密码 KDF 则会被刻意设计得很慢,并且可以调节参数,使暴力破解在计算上难以实现,同时仍允许合法用户在几毫秒内完成登录。

加盐:抵御彩虹表

在专用密码 KDF 出现之前,攻击者会使用彩虹表——其中预先计算了从哈希值反向映射到明文密码的结果。盐值是针对每个用户生成的唯一随机值,会在哈希前添加到密码前面或后面,即使密码相同,也能使每个哈希值都不相同。盐值会与哈希值一起存储在数据库中——它不需要保密,只需保证随机即可。合格的盐值必须满足以下条件:至少 16 字节;由密码学安全的随机数生成器生成;按用户分别存储(绝不能在多个账户之间重复使用)。

PBKDF2:密码标准

PBKDF2(基于密码的密钥派生函数 2)由 RFC 8018 定义,并得到 NIST 批准。它会对密码和盐值反复应用 HMAC 函数(通常为 HMAC-SHA-256),重复次数可以配置。重复次数就是工作因子——截至 2023 年,NIST 建议 PBKDF2-HMAC-SHA256 至少使用 600,000 次 Iterations。PBKDF2 应用广泛(Django、iOS Keychain、WPA2-PSK 都在使用),但它有一个弱点:GPU 可以高效实现它,因此其抵抗 GPU 破解的能力不如其他方案。

# PBKDF2 example (Python pseudocode concept)
# import hashlib
# dk = hashlib.pbkdf2_hmac(
#   'sha256',         # hash algorithm
#   b'password',      # password bytes
#   b'random_salt',   # salt bytes
#   600000            # iterations
# )

bcrypt:内存与 CPU 强度

bcrypt 由 Niels Provos 和 David Mazieres 于 1999 年设计,至今仍被广泛使用。它的关键创新是Cost 因子(轮数参数),每增加一级,计算时间就会翻倍。bcrypt 使用经过修改的 Blowfish 密码,并采用Eksblowfish 密钥设置,这一过程同时需要大量 CPU 和内存资源,因此与 PBKDF2 相比,在 GPU 上加速要困难得多。bcrypt 还将密码输入限制为 72 字节(更长的密码会被截断),因此在某些实现中,需要先使用 SHA-256 对长密码进行哈希。

# bcrypt cost factor
# Cost 10 = ~100ms on modern hardware
# Cost 12 = ~400ms
# Cost 14 = ~1600ms
# Each +1 doubles the work
# Recommended: cost 12-14 for web apps
# Command: htpasswd -bnBC 12 username password

Argon2:现代方案之选

Argon2 于 2015 年赢得密码哈希竞赛,并且是当前 OWASP 推荐的方案。它有三种变体:Argon2d(速度更快,但容易受到旁信道攻击,最适合加密货币),Argon2i(恒定时间,最适合密码哈希),以及 Argon2id(混合模式,适合大多数用途)。Argon2id 可以从三个维度进行配置:time cost(Iterations)、memory cost(所需 RAM)和Parallelism(线程数)。较高的内存要求使其极难在 GPU 上并行化,在 ASIC 上则完全不可行。

# Argon2id recommended parameters (OWASP 2023)
# Memory: 64MB (65536 KiB)
# Iterations: 3
# Parallelism: 4 threads
# Output length: 32 bytes
# argon2 -id -t 3 -m 16 -p 4 -l 32

内存强度:为何能抵御 GPU 攻击

GPU 拥有数千个核心,但每个核心可用的内存有限,因此擅长并行执行简单且占用内存较少的计算。内存困难函数(如 Argon2 和 scrypt)要求每次哈希计算都使用大量 RAM。如果攻击者希望并行运行 10,000 个 Argon2id 计算,且每个计算需要 64MB 内存,那么就需要640GB 的 GPU RAM,这远远超过任何 GPU 集群的可用容量。这种称为内存强度的特性迫使攻击者要么使用缓慢的串行计算,要么投入极高的硬件成本,从而使攻击在经济上得不偿失。

实践中的工作因子调节

合适的工作因子取决于您的硬件和可接受的延迟。通常的目标是:在服务器的生产硬件上,每次认证耗时100 到 300 毫秒。随着硬件性能提升,您应当提高工作因子——这也是 bcrypt 和 Argon2 将参数与哈希值一同存储的原因,从而支持透明升级:用户下次登录时,先验证密码,然后使用更高的新参数重新进行哈希。OWASP 会持续维护 PBKDF2、bcrypt 和 Argon2id 当前推荐的最低参数,这些参数应当每年进行审核。

scrypt:另一种内存困难 KDF

scrypt 由 Colin Percival 于 2009 年设计,是第一种得到广泛采用的内存困难 KDF,目前用于 Litecoin 和许多密码管理器。scrypt 的参数包括 N(CPU/内存成本)、r(块大小)和 p(并行化因子)。与 Argon2 一样,较高的 N 值要求每次计算使用大量 RAM。scrypt 被认为是安全的,但对于新应用,通常更推荐 Argon2id,因为它赢得了 PHC,并且接受了更多密码学分析。两者都是可接受的选择。

不要使用什么:MD5、SHA-1 和未加盐的 SHA

以下几种哈希方式绝不能用于密码:MD5(已被攻破,在普通消费级硬件上每秒可计算数十亿个哈希值)、SHA-1(存在同样的问题)、未加盐的 SHA-256(速度快,彩虹表可以轻易破解),以及简单加密(可逆,密钥被盗就意味着所有密码都被泄露)。历史上的数据泄露事件,例如LinkedIn(2012 年),使用了未加盐的 SHA-1,导致 1.17 亿个密码在数天内被破解。Adobe(2013 年)则对密码进行了加密而非哈希——这是根本性的理解错误,导致 1.53 亿个账户暴露。这些事件都属于 Security+ 考试知识体系的内容。

为加密密钥执行密钥派生

KDF 还可用于从密码派生加密密钥(这不同于存储密码哈希)。当用户为加密保管库设置主密码时,应用会使用 KDF 根据该密码派生出实际的 AES-256 加密密钥。这就是密码管理器能够在本地解密保管库的原因——它会根据您的主密码运行 KDF,以重建加密密钥,而该密钥始终不会离开您的设备。HKDF(基于 HMAC 的密钥派生函数)是从单个高熵秘密派生多个密钥的标准方案,TLS 1.3 使用它派生握手密钥和应用密钥。

凭据填充与 KDF 防护

凭据填充攻击会将在某次数据泄露中窃取的用户名和密码组合,重新用于攻击其他服务。强大的 KDF 能缩短数据泄露后进行离线破解的可行窗口——如果攻击者每次猜测必须耗时 300 毫秒,而不是几微秒,那么破解一个 10 个字符的随机密码在计算上就变得不可行。不过,KDF 无法防止用户在不同网站重复使用密码——这需要用户使用唯一密码。唯一密码 + Argon2id 存储 + MFA的组合,能让基于凭据的攻击在实践中几乎失效。

快速检查

测试您对本课 CompTIA Security+ (SY0-701) 知识点的理解程度。

课程回顾

本课中您学到了:密码 KDF 会经过有意减慢处理,并配有可调节的工作因子,使离线暴力破解攻击在计算上不可行;Argon2id 和 scrypt 这类内存困难函数要求每次计算使用大量 RAM,从而抵御 GPU 并行化;MD5、SHA-1 和未加盐哈希已被多起高影响力数据泄露事件证明完全不适合用于密码存储。接下来,我们将探索后量子密码学,以及 NIST 选定用于替代 RSA 和 ECC 的算法。

常见问题解答

「密钥派生函数:PBKDF2、bcrypt 与 Argon2」课时是免费的吗?

是的 — 「密钥派生函数:PBKDF2、bcrypt 与 Argon2」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cloud & IT Cert Prep 课程的其余内容,请升级到 CoddyKit PRO。 Cloud & IT Cert Prep 课程共包含 4 节课。

「密钥派生函数:PBKDF2、bcrypt 与 Argon2」这节课中我会学到什么?

根据密码哈希算法抵御 GPU 和 ASIC 攻击的能力进行比较,并了解如何调整计算成本和内存难度。 你通过在浏览器中直接运行的动手代码来练习 Cloud & IT Cert Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Cloud & IT Cert Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Cloud & IT Cert Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「密钥派生函数:PBKDF2、bcrypt 与 Argon2」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Cloud & IT Cert Prep 课中编写并运行代码吗?

能。每节 Cloud & IT Cert Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. TLS 1.3 握手与 0-RTT 会话恢复
  2. 经身份验证的加密:AES-GCM 与 ChaCha20-Poly1305
  3. 密钥派生函数:PBKDF2、bcrypt 与 Argon2
  4. 后量子密码学:CRYSTALS-Kyber 与 Dilithium
← 返回 Cloud & IT Cert Prep