所谓"MD5解密",其实是查表
你可能用过这类工具——把一串 MD5 值粘进去,点解密,出来一个明文。感觉很神奇。
但 MD5 是单向哈希,理论上不可逆,这些工具是怎么做到的?
答案很简单:它们根本没有解密,就是查数据库。
背后的数据库存着几十亿条"原文 → 哈希"的对应关系,你输入一个哈希值,它在库里找有没有匹配的原文,找到就返回给你,找不到就显示失败。这个数据库就叫彩虹表,或者更直白地叫哈希字典。
所以工具页上"解密"这个词其实是个不太准确的说法,更准确的叫法是"哈希逆查"或者"碰撞查询"。
彩虹表里有什么?
主要是这几类:
常见密码。123456、password、qwerty、admin……这些密码有几十亿人在用,早就被计算好存进去了。5f4dcc3b5aa765d61d8327deb882cf99 就是 password 的 MD5,随便输进任何一个在线查询工具都能秒出结果。
短字符串。纯数字6-8位、纯小写字母4-6位、手机号、生日(19901010这种格式)……这些排列组合数量有限,都可以提前算完。
以前泄露的真实密码。历史上发生过大量数据库泄露事件,泄露出来的真实密码被整理进字典,这些往往是命中率最高的一批。
为什么有些 MD5 查不到?
有几种情况:
原文本身就很复杂。比如一个20位的随机字符串,组合数量是天文数字,彩虹表根本装不下。
加了盐(Salt)。正确的密码存储方式是在哈希之前把密码和一段随机字符串拼在一起,比如把 password 变成 password$xK92mP` 再哈希,结果就完全不同了,彩虹表里当然也找不到 `password$xK92mP 的哈希。
换了哈希算法。查询工具的数据库针对的是标准 MD5。如果系统里用的是 bcrypt、Argon2 或者加了多轮迭代的方案,这些工具完全没用。
这件事说明了什么?
说明用 MD5 存密码真的很危险,不是危言耸听。
一旦数据库被拖走,攻击者不需要真正"破解"MD5——他们只需要把哈希值往彩虹表里一查,大部分常见密码几秒内就出来了。2012年 LinkedIn 数据库泄露,有研究人员在泄露的6百多万个哈希里,几小时内就还原出了大部分原始密码。当时用的就是这种查表方法,不是什么高深技术。
如果你手上有个 MD5 哈希值需要查一下对应的原文,用 MD5 在线解密工具 试试就知道了——能查到说明原文很常见,查不到说明原文足够复杂或者加了盐,反而是好事。
开发者需要知道的
如果你在做用户系统,密码存储这里请注意:
不要存明文密码,这个应该不用说。
不要只用 MD5,即使加盐也不够——MD5 计算太快,GPU 每秒能算几十亿次,加了盐只是让彩虹表失效,但暴力枚举还是很快。
用专门为密码设计的哈希函数。bcrypt、Argon2、scrypt 这些算法故意设计得很慢,而且计算成本可以调节——你可以让每次哈希花 200 毫秒,对正常用户登录毫无影响,但对攻击者来说暴力破解的成本就高了几个数量级。
密码忘了就重置,别试图还原。如果你系统里有"找回密码"功能,应该是发重置链接,不是把原始密码发给用户。能把原始密码发给用户,说明你根本没有正确存储密码。
MD5 本身并不是完全没用,用来校验文件完整性、做缓存 key、生成内容 ID 这些场景都还好,只是别用来存密码。



加载中...