返回博客列表

为什么现在绝对不能用 MD5 存储密码?

在早期的 Web 开发教程中,几乎所有的老师都会教你:“千万不要明文存储用户密码,一定要用 MD5 加密后再存入数据库。”

这句话在十年前是对的,但在今天,使用 MD5 存储密码是一种极其危险的行为!

MD5 是什么?

首先纠正一个概念:MD5 不是加密算法,而是哈希(Hash)算法(又称散列算法或信息摘要算法)。

  • 加密(Encryption):是双向的,有钥匙就能解密还原(如 AES, RSA)。
  • 哈希(Hash):是单向的,把任意长度的数据变成固定长度(MD5 是 32 位字符)的指纹,理论上无法逆向还原

既然无法逆向,为什么说它不安全?

虽然 MD5 无法通过公式反推,但黑客们发明了两种致命的攻击方式:

1. 暴力破解与字典攻击

MD5 的计算速度太快了。现代的显卡(GPU)集群每秒可以计算数千亿次 MD5 哈希。 如果用户的密码很简单(比如 123456, password),黑客只需几毫秒就能猜中。

2. 彩虹表(Rainbow Table)攻击

黑客预先计算出了世界上所有常见密码(长度 1-10 位、字母加数字组合)的 MD5 值,并做成了一个巨大的数据库(即彩虹表)。 只要你的数据库被拖库,黑客拿到了用户的 MD5 值,去彩虹表里一查,瞬间就能匹配出明文密码。逆向破解变成了简单的数据库查询

如何正确地存储密码?

现代 Web 开发存储密码的最佳实践是:加盐(Salt) + 慢速哈希算法

什么是加盐?

“盐”是一串随机生成的长字符串。我们在用户的明文密码后面拼上这串盐,再进行哈希。 即使两个用户的密码都是 123456,因为盐不同,最终数据库里的哈希值也完全不同。这彻底废掉了黑客的彩虹表。

什么是慢速哈希?

既然 MD5 死于“算得太快”,专家们就发明了“故意算得很慢”的算法,比如 Bcrypt, Argon2, PBKDF2。 这些算法允许你设置一个“工作因子(Cost Factor)”。你可以让计算一次哈希耗时 100 毫秒。这对正常登录的用户来说几乎无感,但对于试图每秒破解上亿次密码的黑客来说,时间成本直接增加了几百万倍,彻底扼杀了暴力破解的可能。

MD5 就一无是处了吗?

不!MD5 在非安全领域依然发光发热。 由于它计算极快,它非常适合用来做文件完整性校验。比如你下载一个几个 G 的大文件,算一下 MD5 看看和官方提供的是否一致,就能立刻知道文件在下载过程中有没有损坏。

如果您需要计算文本的 MD5 值,可以使用我们的 免费 MD5 生成工具