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 重算并覆盖,逐步把用户迁移到新算法。