◆纸鸢志

密码该怎么存:PBKDF2 的实践与边界

不要自己发明加密方案,但至少要理解为什么每次哈希都要加盐、迭代次数意味着什么。

存储密码的唯一正确做法是用专门的口令哈希函数,并且为每个用户单独加盐。这不是洁癖,而是防止一次泄露演变成全站沦陷。

PBKDF2 的思路很直白:把哈希函数反复运行很多次。攻击者每尝试一个候选密码,都要付出同样的迭代成本。现代实践建议迭代次数不低于 10 万次(SHA-256),并把这个次数写进存储格式,方便日后升级。

存储格式值得强调。我们把盐、迭代次数、哈希值拼成 `salt$iterations$hash` 三段式存进数据库。这样做的好处是:将来把迭代次数提到 60 万时,老用户仍然能正常登录,并在下次登录成功时静默升级哈希。格式自带版本信息,是平滑迁移的前提。

校验时一定要用恒定时间比较,避免通过响应时长泄露信息。同时,无论「邮箱不存在」还是「密码错误」,对外都应返回同一句提示——否则登录接口就成了账号枚举器。

PBKDF2 不是最强的选择,Argon2id 或 scrypt 在抗 GPU 破解上更好。但在 Cloudflare Workers 这类运行时里,Web Crypto 原生提供 PBKDF2,零依赖、无 wasm 冷启动开销,是工程上很稳的折中。

陈舟

@chenzhou

全部文章

评论

1 条
林晚2026 年 10 月 6 日

恒定时间比较容易被忽略,这里点出来很有必要。

继续阅读