首页/安全/加密与证书速查/MD5 消息摘要(已不安全)
加密算法基础95 条

MD5 消息摘要(已不安全)

RFC 1321 定义的 128 位摘要算法,块长 512 位;2004 年公开碰撞攻击,此后被用于伪造证书等场景,不能用于签名与证书。

加密与证书速查安全更新于 2026-10-13

MD5 是什么

MD5 是 RFC 1321 定义的 128 位摘要算法,块长 512 位、输出 16 字节。2004 年起碰撞构造被公开,此后被实际用于伪造证书、篡改文件、构造同名不同内容的下载包。它今天只应出现在非对抗性的场景(缓存键、去重提示),任何与签名、证书、口令相关的用途都必须替换。

基本信息

标准RFC 1321
摘要长度128 位(16 字节,32 个十六进制字符)
块长度512 位
安全现状碰撞可实际构造,RFC 6151 给出迁移建议
不可用于数字签名、证书、代码签名、口令散列
仍可能用于非安全的缓存键、临时去重、老接口兼容

典型使用场景

  • 识别遗留系统:盘点接口签名、Cookie 校验与文件校验里仍在使用 MD5 的位置
  • 兼容老设备或老协议:某些老设备只提供 MD5 摘要,需评估风险并设退场计划
  • 缓存与去重键:非对抗场景下用 MD5 缩短键长度,但要接受碰撞可能
  • 老数据迁移:历史存储的 MD5 摘要需要在用户下次登录时静默升级算法
  • 渗透与扫描复盘:扫描器把 MD5 列为弱算法提示时,判断是提示级还是严重级

计算与识别

计算与识别
# 计算摘要(仅用于兼容与排查,不要用于签名)
md5sum package.tar.gz
openssl dgst -md5 package.tar.gz
# 空字符串的 MD5 是固定值,可用于快速自检工具是否正常
d41d8cd98f00b204e9800998ecf8427e
# 从证书或二进制里找出仍在使用的 MD5 签名
openssl x509 -in cert.pem -noout -text | grep -i 'md5'
# 批量清点目录里由 MD5 生成的校验清单文件
ls *.md5 2>/dev/null | head

替代选型对照

原用途风险替代方案
文件校验清单可构造碰撞,清单与文件同时被替换无法发现SHA-256 清单,并随发布物签名
数字签名与证书可伪造签名内容与证书主体SHA-256 及以上;证书必须停止使用 SHA-1/MD5
口令存储离线爆破成本极低,撞库面扩大Argon2id、scrypt 或高迭代 PBKDF2
接口签名可构造不同参数得到相同签名HMAC-SHA256 并纳入时间戳与路径
缓存键与去重碰撞会造成误命中可保留,但需接受并评估误命中影响
MD5 不能用于数字签名、证书指纹或口令散列。很多扫描工具把它标为「弱算法提示」,容易被当成低优先级;一旦出现在签名或口令链路里,属于必须立即整改的高风险问题。
口令场景的迁移要平滑:老系统里存的是 MD5 值,直接换算法会让所有用户无法登录。常见做法是保留旧字段用于校验,登录成功后再用 Argon2id 重算并覆盖,逐步把用户迁移到新算法。

易错点

  • 把 MD5 用在签名或证书上:碰撞可实际构造,攻击者能准备两份内容不同但摘要相同的文件,签名对其中一份有效即对另一份有效
  • 用 MD5 存口令:无盐单轮哈希在现代 GPU 下近乎明文,撞库与离线爆破成本极低
  • 只把新数据换成新算法,老数据继续用 MD5:风险敞口长期存在,应设计登录时重算的迁移路径
  • 把 MD5 当作「足够快的校验和」而忽略碰撞:非对抗场景可以接受,但一旦涉及安全判定就必须替换
  • 在合规检查中只统计算法使用点,不核对实际生效链路:配置里改了但底层库仍走 MD5,等于没改

数据来源与参考

  • RFC 1321(MD5)
  • RFC 6151(MD5/SHA-1 安全考虑与迁移)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌