极简工具箱

免费在线工具 · 本地计算 · 无需上传

MD5 是什么、还能不能用:碰撞、加盐与替代方案

「MD5 加密」这个说法本身就是错的——它是哈希,不可逆。更麻烦的是它早已被攻破,用来存密码或做签名等于没做。

广告位(百度联盟)

一、MD5 到底做了什么

MD5 把任意长度的输入,算成一个固定 128 位(16 字节) 的摘要,通常写成 32 位十六进制:

MD5("hello") = 5d41402abc4b2a76b9719d911017c592

三个特性:同样的输入永远得到同样的输出;输出长度固定;不可逆(无法从摘要反推原文,只能靠穷举比对)。正因为不可逆,它叫哈希/摘要,不叫加密。

二、它已经不是「安全」的算法

所以下面这些用法都应该停止:

用法风险
md5(password) 存数据库拖库后大批密码直接被还原
用 MD5 做接口签名可构造碰撞绕过校验
用 MD5 校验下载包无法抵御主动篡改(只防传输损坏)

三、密码到底该怎么存

不要用任何快速哈希。正确做法是专用密码哈希函数 + 每用户随机盐 + 可调成本:

import bcrypt
h = bcrypt.hashpw(b'user_password', bcrypt.gensalt(rounds=12))
bcrypt.checkpw(b'user_password', h)

如果历史系统里存的是 MD5,迁移方案是「登录时验证通过后用新算法重算并写回」,不要一次性全量改(无法还原明文)。

四、MD5 仍然合理的地方

只要涉及「有人在故意伪造」,就换成 SHA-256 或更强。

五、和 SHA-256 怎么选

SHA-256 输出 256 位、目前没有实用碰撞,是现在做校验和签名的默认选择。代价是慢一些、摘要长一倍(64 位十六进制)。日常校验文件、校验下载包,直接用 SHA-256;只有对方系统只支持 MD5 时才用 MD5,并在文档里注明这是兼容而非安全选择。

要算一段文本的摘要,用 MD5 计算 或 SHA 计算;文件不落盘、直接在浏览器里算,用 文件哈希校验。

小结

MD5 = 128 位快速哈希,碰撞已被攻破;不能存密码、不能做安全签名;存密码用 bcrypt/Argon2id,校验文件优先 SHA-256。看到「MD5 加密」这四个字,先想到它其实是「摘要」。

本文相关工具(本地计算,无需上传)

更多使用教程