MD5 加密教程

同一张发票两个人算出的 MD5 对不上,问题常出在传输环节。三个实测值与 RFC 1321 官方答案对照,讲清雪崩效应、校验操作细节,以及 MD5 现在不该再用的场景。

一张扫描件,两个 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 的区别;校验值对不上按 哈希值不一致排查 走一遍;文件分发场景参考 文件校验和怎么核对。

去使用 MD5 加密工具