直接回答:密码存储的唯一正确姿势是慢哈希+每用户随机盐:Argon2id(当前首选,RFC 9106)、bcrypt、scrypt 任选,参数按目标硬件调到校验耗时 100~500ms。MD5/SHA 系列哪怕加盐也不合格:它们是为速度设计的,GPU/ASIC 每秒可试数十亿候选,离线拖库后弱密码成批沦陷。慢哈希通过刻意消耗 CPU 时间(bcrypt/scrypt)和内存(scrypt/Argon2,抗 GPU 并行)把单次猜测成本拉高数量级。

展开解析:工程细节:盐由加密随机数生成器产生、至少 16 字节、与哈希结果一起存(Argon2 的 PHC 格式一行含算法、参数、盐、哈希,天然支持升级);成本参数随硬件进步定期上调,老哈希在用户下次登录时透明重算。再加两道纵深:服务器端 pepper(全局密钥参与 HMAC 后再哈希,存 HSM/KMS 而非数据库,拖库者没有 pepper 无法离线爆破);注册环节接入已泄露密码库(k-anonymity 查询)拒绝常见弱密码。登录接口的时序也要均匀——用户不存在时也跑一次假哈希,防账号枚举。记住边界:哈希防的是拖库后的离线爆破,在线爆破靠限流和 MFA,两套机制不可互替。

追问方向:Argon2 的内存参数为何抗 GPU?pepper 与 salt 的分工?哈希参数升级的迁移方案?

(约 460 字)