我的博客

用户密码该怎么存:从 MD5 到 scrypt

自己写网站的登录功能时,密码怎么存是绕不开的问题。网上能搜到的方案五花八门:MD5、MD5 加盐、SHA256、bcrypt……到底该用哪个?

先说结论:不要用任何通用哈希算法(MD5、SHA 系列)存密码,应该用专门的密码哈希算法:Argon2id、scrypt 或 bcrypt。

为什么 MD5 不行

MD5 的问题不只是"已经被破解了"。真正的问题是它太快了。

通用哈希算法的设计目标就是快,一块普通显卡每秒能计算上百亿次 MD5。数据库一旦泄露,攻击者可以对常见密码逐个尝试,8 位以内的简单密码几乎可以全部还原。

加盐能解决吗

加盐(给每个用户的密码拼上一段随机字符串再哈希)能防止"彩虹表",也能让相同的密码得到不同的哈希值。但它不能让计算变慢,攻击者仍然可以针对每个用户逐个暴力尝试。

SHA256 加盐也一样,只是从"很快"变成了"也很快"。

密码哈希算法的思路

专门的密码哈希算法故意设计得很慢、很耗内存:

  • 用户登录时只计算一次,慢一点(几十到一百毫秒)完全没感觉;
  • 攻击者要尝试几十亿次,每次都这么慢,成本就高到不可接受;
  • 耗内存的算法(scrypt、Argon2)还能让显卡并行破解的优势大打折扣。

下面详细讲如何选择算法、设置参数,在 Node.js 中正确实现,以及如何把老系统的 MD5 密码平滑迁移过来。

剩余内容需付费阅读

¥5.90

购买后永久可读