工具介绍
MD5(Message Digest 5)可以把任意输入——一个单词、一个密码、甚至一整个文件——转换成固定长度的 128 位指纹,以 32 位十六进制字符表示。相同的输入永远得到相同的哈希值,哪怕只改一个字符,结果也会完全不同。
“加密”这个词经常被用来形容 MD5,但严格来说并不准确。加密是可以用密钥还原的,而哈希从设计上就不可逆。网上那些“MD5 解密”网站并不是真的在做数学上的逆运算——它们只是把哈希值拿去和一个巨大的、预先计算好的常见词库/密码库做比对,只有当你的原文恰好在那个库里时才能“解出来”。
MD5 由 Ron Rivest 于 1992 年发布,作为 RFC 1321 标准的一部分。它在安全用途上已被证明存在漏洞(可以人为制造碰撞),但在不涉及安全的场景,例如校验和、缓存键和去重,依然被广泛使用。
为什么使用它?
- 生成 MD5 哈希值,校验文件或字符串是否被意外改动。
- 与已知/公布的 MD5 值比对,确认数据完整性。
- 生成确定性的缓存键或去重 ID。
- 清楚理解为什么“解密”MD5 哈希值实际上是不可能的。
- 100% 本地运行:你的输入在浏览器中完成哈希计算,绝不会上传。
使用方法
- 在输入框中输入或粘贴文本。
- 点击“计算 MD5”。
- 查看生成的 32 位哈希值(如需大写,勾选“大写输出”)。
- 点击“复制”获取哈希值,或用它与你已有的哈希值进行比对。
示例
输入
hello输出
5d41402abc4b2a76b9719d911017c592MD5 是确定性的:文本“hello”在任何工具上、任何时候都会得到这个完全相同的哈希值。
“加密”与“哈希”:术语为什么重要
加密和哈希解决的是不同的问题,混淆两者会导致真正的安全隐患。加密是用密钥进行可逆转换——用密钥加密,用对应的密钥解密,就能还原原文。哈希是完全不可逆的单向转换,根本没有密钥这一说——从设计上就不存在把哈希值还原为原文的操作。
MD5 是一种哈希函数,而不是加密算法。日常口语中说“MD5 加密”很常见,但这会造成错误预期:不存在合法的“MD5 解密”操作。任何声称能做到这一点的服务,要么是查表(只对常见的、已知的输入有效),要么根本就不管用。
MD5 依然适用的场景
- 运行前校验下载的文件是否与发布方提供的校验和一致。
- 根据 URL 或查询字符串生成确定性的缓存键。
- 通过对每条记录求哈希再比对哈希值来去重,而不必比对完整文本。
- 快速判断两个文件是否字节级完全相同,而不用直接做逐字节比对。
什么场合应完全避免使用 MD5
密码存储、数字签名,以及任何攻击者能从伪造匹配中获益的场景,都绝对不要使用 MD5。因为碰撞可以被人为构造,而且较短或常见输入的未加盐 MD5 值可以通过查表还原,MD5 在这些场景中不提供任何实际安全性。密码请使用 bcrypt、scrypt 或 Argon2;需要抗篡改的签名与完整性校验,请使用 SHA-256 或更强的算法。
常见问题
我能把 MD5 哈希值解密还原成原文吗?
不能——哈希从设计上就是单向的,无法从哈希值反推出原文。所谓的“MD5 解密”网站只是在一个巨大的常见输入预计算表里做查找,所以独特或较长的原文根本无法被还原。
那“MD5 解密”网站到底在做什么?
它们维护着庞大的数据库,把常见单词、姓名、泄露的密码和它们对应的 MD5 值一一对应存好,然后做查表匹配。如果你的原文不在这个库里(对于任何不那么简单的内容来说很常见),它们就根本查不出结果。
MD5 适合用来存储密码吗?
绝对不适合。MD5 计算速度快,容易被暴力破解,也存在已知的碰撞攻击,而查表“解密”正是破解未加盐 MD5 密码存储的常见手段。密码应使用 bcrypt、scrypt 或 Argon2。
为什么同样的文本在另一个工具上得到不同的哈希值?
通常是一些看不见的差异:末尾多了一个换行或空格、换行符不同(\r\n 与 \n)、或文本编码不同。只要字节完全相同,MD5 哈希值就一定完全相同。
我的文本会被上传到服务器计算吗?
不会。MD5 哈希值是通过 JavaScript 直接在你的浏览器中计算的,你的输入不会被传输到任何地方。