好要秀复的 MD5,为什么你的口令仍在漏渗
Site Owner
Published on 2026-06-16
MD5已被破解、SHA-1已成历史,但每年仍有大量系统在用它存口令。为什么程序员前赴后继地踩这个坑?本文从雪崩效应、彩虹表攻击、密码存储演化三个维度,说清摘要算法的来龙去脉,以及你立刻可以做的三件事。
好要秀复的 MD5,为什么你的口令仍在漏渗
2017年的某个深夜,Google研究员Shovel对外宣布:MD5终于被正式破解了。
消息传到国内时,国内大多数互联网公司的数据库里,几亿用户的密码仍然以MD5裸存的形式躺着。
这不是段子。这是2017年中国互联网的真实安全水平。
十年过去了。MD5的论文依然每年被引用数万次,SHA-1的葬礼每年都在安全大会上重复举办,而你的密码——很可能仍在用一把1991年的锁具锁着。
摘要算法,这个听起来像"加密"但实际上"不是加密"的东西,正在以极其隐蔽的方式,成为每一代程序员踩坑的盲区。
你以为你在加密,其实你只是在"算摘要"
很多人第一次接触MD5,是在写用户注册功能时。
password_hash = md5(password)
这段代码看起来合乎直觉:密码存进去,拿出来比对,成功。但这里有一个根本性的误解——MD5不是加密算法,是摘要算法。
加密与摘要的本质区别在于:加密是可以解密还原的,摘要是不可逆的。
如果你用AES加密一段文字,你可以用密钥还原出原始内容。但MD5给你一个128位的字符串,你无法从这128位倒推出原始密码是什么。
这听起来像是"更安全"——其实恰恰相反。
摘要算法的设计目的,是"我知道答案,但我不想让你知道"。 就像公司的工牌刷卡门禁系统:系统里存的不是你的密码,而是密码的"摘要值"。刷卡时,系统把你输入的内容做个摘要,和存储的值比对——一致就开门。
这个设计本身没问题。问题出在人们把一个"不可逆"的工具,用在了"可解密"更安全的地方。
雪崩效应:一只蝴蝶扇动翅膀,能撞死你全家
摘要算法有一个令人着迷的特性:雪崩效应。
你输入admin,MD5计算结果是21232f297a57a5a743894a0e4a801fc3。
现在你把密码改成admin1,只改了一个字符:
21232f297a57a5a743894a0e4a801fc3 → 352427b939190934b6719ccl0f3c92d4
两个输出之间,找不到任何规律。看似随机的128位里,每一个bit位都发生了不可预测的变化。
这个特性的本意是:给攻击者制造障碍,让他无法通过分析输出模式来推断输入规律。
但讽刺的是,MD5的雪崩效应,挡不住彩虹表攻击。
彩虹表:当你的"不可逆"变得可查
2010年以后,黑客们流行使用"彩虹表"来破解MD5。
所谓彩虹表,是一张预先计算好的"密码-Hash对照表"。黑客知道你的密码Hash值后,不需要任何计算,直接在彩虹表里查——如果你的密码足够简单常见,几毫秒就能查到原文。
比如黑客拖库后拿到f30aa7a2c4e5d5f4a4c3b2a1d0e9f8a7,一查彩虹表,结果是123456。
要对抗彩虹表,业界使用"加盐"(Salt)技术:在每个用户密码前面加上随机字符串,然后再做MD5。
salt = random_string()
password_hash = md5(salt + password)
这样,即使用户密码相同,由于盐值不同,Hash结果也不同。彩虹表攻击失效。
然而——2017年仍然有大量公司的数据库里存的是md5(password),没有盐,没有迭代次数,没有bcrypt/PBKDF2。
这就是为什么每年拖库事件发生后,我们总能在社工库搜索网站里查到自己的邮箱和明文密码。
你的密码并没有"被破解",它只是被"查"了出来。
MD5倒下了,但SHA-1也没活多久
MD5的破解历程,本身就是一部安全技术的警示录。
1991年,Ron Rivest设计MD5,输出128位。2004年,山东大学的王晓云教授证明MD5存在碰撞——可以在不知道密钥的情况下,找到两个不同的输入,输出相同的Hash值。
但学术界的证明花了13年才引起工业界的重视。2008年,MD5的碰撞被实际用于伪造SSL证书。直到这一刻,企业才开始大规模替换MD5。
2017年,Google正式宣布MD5"已死"。
SHA-1的命运类似。1993年诞生,160位输出,2017年Google攻破SHA-1第一例碰撞——历时24年。
MD5: 128位 → 2004年学术破解 → 2008年实际攻击 → 2017年正式"死亡"
SHA-1: 160位 → 2017年碰撞实例 → 现已不推荐使用
SHA-256: 256位 → 目前推荐使用
SHA-512: 512位 → 目前推荐使用
每一次"破解"的间隔都在缩短。不是算法变弱了,而是计算能力变强了,攻击手段变多了。
MD5倒下了,但真正的问题是:我们用MD5来做什么?
为什么你仍然在用MD5存密码
既然MD5这么危险,为什么在2026年仍然有人在用它?
答案很简单:MD5很快,快到在业务代码里根本感觉不到性能损失。
当系统需要每秒处理上万次登录请求时,一个MD5只需要不到1微秒。但bcrypt需要几十毫秒,PBKDF2需要几百毫秒。
性能差距是几万倍。
所以很多早期系统(2010年前后建设的)默认选了MD5,上线后业务跑起来了,没人敢动密码存储模块——因为它牵一发动全身,改错了用户全丢。
技术债,就是这样积累的。
另一个原因:很多程序员根本不知道MD5"不安全"。
大学教材里MD5是"摘要算法"的经典案例,教科书不会告诉你MD5已被破解。信息不对称,是安全问题的第二层窗户纸。
所以呢?三件事你可以立刻做
第一,不要再用MD5/SHA-1存密码。如果你的系统还在跑md5(password),请立即改为bcrypt、argon2或PBKDF2。这些算法故意设计得很慢——慢到正常用户登录感觉不到差异,但黑客暴力破解的成本会高出几万倍。
第二,如果你在用MD5做文件完整性校验,确保用的不是MD5。下载开源软件时官网提供的MD5校验值,基本只对"文件传输过程有没有出错"有效,对"文件有没有被篡改"完全无效。验证完整性请用SHA-256。
第三,关注口令,但更关注认证机制。现实中最大的密码泄露,往往不是因为MD5被破解,而是因为密码复用、钓鱼、社会工程。MD5不安全是事实,但把它当成替罪羊,会让你忽视更根本的安全问题。
那个1991年的锁具,现在还在你家门上挂着。
不是因为它好,是因为换锁太麻烦。
但至少,你可以先检查一下——你家的锁,是哪一年挂上去的。