MD5 加密
计算文本的 32 位 MD5,可批量与大小写切换
MD5 已不安全:它还能用在哪里,绝对不能用在哪里
MD5 是什么
MD5 把任意长度的输入映射成固定的 128 位(16 字节),通常写成 32 个十六进制字符。设计目标是快、雪崩效应好(输入改一位,输出面目全非)、分布均匀。
它被广泛用于文件校验、缓存键生成、去重、以及(历史上)密码存储。今天它的定位需要严格区分:作为非对抗性的完整性校验它是有效的,作为任何安全用途它已经失效。
MD5 为什么已经被攻破
- 碰撞攻击在 2004 年就被公开。王小云等人给出了构造 MD5 碰撞的方法,计算量从理论上的 264 降到可以实际完成的量级。
- 2008 年实际攻击落地。研究人员用 MD5 碰撞伪造了 CA 签名的中间证书,证明"两个不同内容有相同 MD5"不只是理论问题。
- 2012 年 Flame 恶意软件利用 MD5 碰撞伪造了 Microsoft 的代码签名证书,用来在目标网络里伪装成合法更新。
- 算力早已不是门槛。现代 GPU 上每秒可以计算数十亿次 MD5,这让穷举和字典攻击的成本低到可以忽略。
结论:任何对手可以在你之后提交数据的场景,MD5 都不能用。这包括证书、代码签名、软件分发校验(有攻击者能替换文件时)、数字签名、协议认证。
MD5 仍然合理的使用场景
- 下载后的传输校验。文件从自己的服务器下载,用 MD5 确认没有传输损坏。注意这里防的是"意外损坏",不是"恶意替换"——后者需要 SHA-256 或签名。
- 缓存键与去重。把长 URL 或长文本压成 32 字符做缓存索引,只是要个短指纹,不涉及安全性;即使发生碰撞,后果也只是缓存命中错误,不是安全漏洞。
- 内容指纹与分块标识。断点续传、内容寻址存储里用作快速比对。
- 数据分区与布隆过滤器。追求速度、不追求抗碰撞。
绝对不能用的地方
- 密码存储。这是最严重的一类。MD5 太快了,意味着攻击者每秒能试数十亿个候选密码;加上不加盐,一张彩虹表就能同时破解大量账户。密码必须用专门设计的慢哈希:bcrypt、scrypt 或 Argon2,它们有可调的计算成本和内存成本,并且内置随机盐。
- 消息完整性认证。要防止他人篡改,需要带密钥的方案——HMAC-SHA256 或数字签名,而不是裸哈希。
- TLS 证书、代码签名、软件更新。这些必须用 SHA-256 及以上。
和同类算法怎么选
| 算法 | 输出长度 | 安全性 | 用在哪 |
|---|---|---|---|
| MD5 | 128 位 / 32 字符 | 已破(碰撞可行) | 仅非对抗性校验、缓存键 |
| SHA-1 | 160 位 / 40 字符 | 已破(SHAttered 2017) | 仅历史兼容,别用在新设计里 |
| SHA-256 | 256 位 / 64 字符 | 目前安全 | 通用首选 |
| SHA-512 | 512 位 / 128 字符 | 目前安全 | 需要更长输出时 |
| bcrypt / Argon2 | 可变 | 专为抗暴力破解设计 | 密码存储 |
还有一点常被忽略:哈希不是加密。哈希不可逆,不提供保密性。把敏感数据做 MD5 就以为"脱敏"了是错的——对于身份证号、手机号这类低熵数据,穷举空间很小,一张预计算表就能反查。
本工具在浏览器本地计算,输入内容不会离开你的设备。同时支持大写和小写十六进制输出。
常见问题
可以解密 MD5 吗?
不能。MD5 是单向散列,无法从结果反推原文。网上所谓"MD5 解密"其实是查彩虹表比对,只能命中常见弱口令。
本站用的什么实现?
页面内自带的纯 JavaScript 实现,输入内容不离开浏览器。