现代密钥派生函数
PBKDF2 有一个主要弱点:它不抗 GPU,也不抗 ASIC,因为它使用的 RAM 相对较少,可以在 GPU(显卡)或 ASIC(专用硬件)上高效实现。
Scrypt 和 Argon2 等现代密钥派生函数(KDF)旨在抵抗字典攻击、GPU 攻击和 ASIC 攻击。这些函数从密码(文本)派生固定长度的密钥,并需要大量内存(RAM),因而无法在 GPU 或 ASIC 硬件上进行快速并行计算。
Bcrypt、Scrypt 和 Argon2 等算法被认为是更安全的 KDF 函数。它们使用盐 + 大量迭代 + 大量 CPU 计算 + 大量 RAM,因此很难设计出能够显著加速密码破解的定制硬件。
派生密钥需要大量 CPU 时间(如 0.2 秒)和大量 RAM 内存(如 1GB)。计算过程依赖内存,因此内存访问是计算瓶颈。更快的 RAM 访问会加速计算。
当从给定密码派生密钥需要大量 CPU 和 RAM 时,即便使用非常优秀的密码破解硬件和软件,破解密码也会缓慢且低效(例如每秒尝试 5-10 次)。现代 KDF 函数的目标,是让通过暴力攻击从哈希逆向还原密码在实践中不可行。
下面更详细地讨论 Scrypt、Bcrypt 和 Argon2。