结论:三者都是为口令散列设计的慢哈希(自带盐、可调成本),区别在于抵抗的硬件攻击维度:bcrypt(1999)抗 CPU/GPU 但内存需求小(4KB),FPGA/ASIC 攻击成本低;scrypt 引入内存硬度(memory-hard,默认 16MB+),抬高并行破解的硬件门槛;Argon2(2015 年密码哈希竞赛冠军)同时可调时间、内存、并行度,是对 GPU/ASIC 最均衡的现代选择——OWASP 当前推荐 Argon2id。
展开:选型要点:1)Argon2id 混合了 Argon2i(抗侧信道)与 Argon2d(抗 GPU 折戟攻击),参数参考 OWASP:m=19MB、t=2、p=1,目标让单次哈希耗时 ~500ms 以内的服务器可承受最大值;2)bcrypt 的隐性坑:密码按 72 字节截断(超长密码 silent truncation)、旧实现有 8bit 处理 bug,新系统别选、存量系统无需急着迁;3)scrypt 仍是合规友好选项(NIST 认可度高)。架构层实践:哈希之外加 pepper(全局密钥,存 KMS/HSM,与盐分开)——库拖走后没有 pepper 无法离线破解;参数随硬件升级定期上调,旧哈希在用户下次登录时透明重哈希迁移。易错点:自己用"SHA256 + 盐"代替——快哈希让 GPU 每秒试数十亿次,盐只防彩虹表不防暴力;cost 参数写死进代码多年不调。
from argon2 import PasswordHasher
ph = PasswordHasher(memory_cost=19456, time_cost=2, parallelism=1)
h = ph.hash(password) # 格式自带算法与参数:$argon2id$v=19$m=...
ph.verify(h, password)
追问方向:PBKDF2 的合规地位(FIPS)与为何新系统不优选、 breached password 检查(k-anonymity API)与哈希的关系。