一张扫描件,两个 MD5
财务发来同一张发票扫描件,你这边算出的 MD5 和对方报过来的对不上。文件同名、体积看着一样,结果就是不同——问题多半出在传输环节:微信发图会重新压缩,邮件网关可能改写附件,Windows 记事本给文本文件补了回车符。MD5 按字节计算,任何一格变化都会让结果面目全非。
改一个字节,结果差多远
三个输入肉眼几乎一样,结果毫无相似之处:hello 是 5d41402abc4b2a76b9719d911017c592,末尾加一个空格变成 f814893777bcc2295fff05f00e508da6,把 o 换成 p(hellp)得到 c983190483df167d2a3841463c2a9341。这就是雪崩效应,输入动一位,摘要里约一半的位跟着翻转,靠看前缀猜内容是走不通的。
- 三个输入都是五个字符,长度一致,结果之间看不出任何关联
- 比对必须逐位全等,前几位相同没有任何参考价值
- 所以校验场景要的是「全等判断」,不是「相似度打分」
先验工具,再验文件
RFC 1321 附录给了三组标准答案:空字符串 d41d8cd98f00b204e9800998ecf8427e、abc 得 900150983cd24fb0d6963f7d28e17f72、message digest 得 f96b697d7cb7938d525a2f31aaf161d0。拿在线工具或命令行先跑这三组,全对再去校验文件——尺子先校准,量出来的数才作数。
这些场合别再碰 MD5
- 密码存储:md5(123456) 是 e10adc3949ba59abbe56e057f20f883e,网上彩虹表一查就破,加盐也挡不住现在的算力
- 数字签名与证书:碰撞攻击已被公开演示,签名体系早就换成 SHA-256 及以上
- 需要抗篡改的发版校验:下载站除了 MD5,建议同时公布 SHA-256 值
文件校验的实操细节
大文件用命令行更稳:Linux 下 md5sum 文件名、macOS 用 md5 文件名、Windows 用 certutil -hashfile 文件名 MD5。批量下载时把公布值贴成清单文件,一次比对整批。遇到不一致先看字节数,大小不同就别再纠缠哈希。MD5 在线计算 可以随时对照。
常见问题
- 网上说 MD5 不安全,还能用吗
- 完整性自检可以,安全场景不行。区别在于攻击者有没有动机去构造碰撞。
- MD5 能还原出原文吗
- 不能,摘要不可逆。它能做的只是「同样输入算出同样结果」。
- 32 位和 128 位是什么关系
- 128 位指摘要长度(16 字节),32 位是它的十六进制写法,一回事。
- 大小写不同的两串算同一个值吗
- 算,十六进制大小写只是书写差异。
相关阅读
选算法看 SHA-256 与 MD5 的区别;校验值对不上按 哈希值不一致排查 走一遍;文件分发场景参考 文件校验和怎么核对。