为什么现在绝对不能用 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 生成工具。