Argon2 是最好用的。它已经过充分审查,是深入研究的主题。它被选为密码哈希竞赛 (PHC) 的获胜者,以取代 scrypt,后者具有一些令人讨厌的时间记忆权衡 (TMTO) 攻击,并且在配置上几乎没有那么灵活。
Argon2赢得了 PHC 并基于对权衡攻击的彻底分析。它需要可配置的内存量才能运行,攻击者要么需要每个暴力线程使用那么多内存,要么需要执行更多的计算。每个内存通道都会降低攻击者以内存需求换取时间需求的灵活性。有两种主要的 Argon2 模式,称为 Argon2i 和 Argon2d。前者旨在抵御侧信道攻击,而后者旨在最大限度地提高安全性以抵御离线攻击。还存在一种混合 Argon2id,它使用 Argon2i 进行第一次内存传递,使用 Argon2d 进行后续传递。
bcrypt是根据 Blowfish 的密钥计划设计的较旧的 KDF,速度很慢。它需要 4 KiB 的快速内存来计算,这使得它在基于 GPU 的破解者上效率低下,因为它们使用了竞争内存。这是因为 GPU 有许多核心,但每个核心必须共享对主 VRAM 的访问。因为 bcrypt 在运行时会读取和修改 4 KiB 的状态,所以多个并行 GPU 核心会争夺谁可以访问主内存总线,结果是大多数核心处于空闲状态,等待直到他们可以访问他们需要的内存执行 bcrypt 评估。
scrypt是一个内存硬 KDF,但它比 Argon2 受到更严重的 TMTO 攻击。也就是说,如果攻击者没有足够的内存,他们可以在相同的输入上运行 scrypt,而内存少于执行更多操作所需的内存。另外,scrypt 的内部内存和时间要求不是独立的,所以在不增加处理时间的情况下不可能增加内存使用量,反之亦然。对于可能只想在每次计算上花费几十毫秒但又想使用几兆内存的服务器来说,这可能会成为一个问题。
Catena是 PHC 的候选人之一,但它没有赢得比赛。我没有读过这篇论文,所以我真的不能说太多,但是因为它没有获胜,所以它不会有那么多的研究,所以如果有任何问题,可能不会被发现. 然而,这并不是一个糟糕的选择,因为它仍然是重要研究的主题,并且具有坚实的理论基础。我还是不会用。
PBKDF2是最古老的 KDF 之一,并且可能是最常见的。它不是内存困难的,这意味着攻击者可以对其执行大规模并行攻击而不会遇到内存问题。PBKDF2 的工作原理是采用任何键控散列,通常是 HMAC,并多次运行它,这样每个散列评估都依赖于所有先前的散列评估。不幸的是,HMAC 中使用的典型哈希几乎不需要计算内存,因此攻击者可以在 GPU 和 ASIC 上大规模并行蛮力搜索,而不会遇到内存硬 KDF 会导致的问题。