MD5 vs SHA1 vs SHA256:该用哪个
三种算法对比速览
Algorithm Output Bits Hex Chars Status
MD5 128 32 Broken (collision attacks practical)
SHA1 160 40 Broken (collision attacks demonstrated)
SHA256 256 64 Secure (no known practical attacks)
Performance (higher = faster):
MD5 ≈ 100%
SHA1 ≈ 80%
SHA256 ≈ 40%
SHA1 的安全现状
SHA1 的安全状态介于 MD5 和 SHA256 之间:比 MD5 安全,但已被证明不再安全。2017 年,Google 和 CWI 研究所完成了第一次真实的 SHA1 碰撞攻击(SHAttered 项目),生成了两个内容不同但 SHA1 值相同的 PDF 文件。这次攻击消耗了约 6500 CPU 年和 100 GPU 年的计算,虽然成本巨大,但证明了 SHA1 在有充足资源的攻击者面前不再安全。
主要浏览器和 CA 机构从 2016–2017 年起停止接受使用 SHA1 签名的 TLS 证书。Git 仍然使用 SHA1 用于对象标识,但 Git 的使用场景中碰撞攻击的实际威胁相对可控,且 Git 已经在过渡到 SHA256。
各算法在各场景的推荐
- **TLS/SSL 证书签名:**SHA256(必须)。MD5 和 SHA1 证书不被现代浏览器接受。
- **Git 提交哈希:**历史上是 SHA1,新版 Git 支持并推荐 SHA256(需在 init 时指定)
- **文件完整性校验(防篡改):**SHA256,MD5/SHA1 均不推荐
- **文件去重/缓存键:**MD5 或 SHA1(速度优先,无安全需求时可用)
- **密码哈希:**三者都不应该单独用于密码哈希!应使用 bcrypt、Argon2 或 PBKDF2
- **HMAC(消息认证码):**HMAC-SHA256 是当前最广泛使用的安全选择,HMAC-MD5 已不推荐
SHA1 的历史地位
SHA1 由 NSA 设计,1995 年发布,长期是互联网安全基础设施的核心——TLS 证书、SSH 密钥、PGP/GPG 签名、Git 版本控制等都使用 SHA1。它比 MD5 多了 32 位(160 vs 128),提供了更强的安全边际,但随着计算能力的提升,最终也被攻破。SHA1 的退场是密码学演进的正常过程,提醒我们安全标准需要随时间更新。
长度扩展攻击:三者的共同弱点
MD5、SHA1 和 SHA256 都基于 Merkle-Damgård 构造,都容易受到长度扩展攻击(Length Extension Attack)。这种攻击允许攻击者在不知道原始消息内容的情况下,计算出 hash(secret + message + attacker_controlled) 的哈希值。解决方法是使用 HMAC(将消息用密钥包装),或使用不受此攻击影响的 SHA-3。
简单的决策树
Is this security-sensitive?
├─ YES → Use SHA256 (or SHA-3/SHA-512)
│ Never use MD5 or SHA1
└─ NO (e.g., deduplication, caching)
├─ Speed critical? → MD5 (simple, fast)
└─ Otherwise → SHA256 (future-proof)
立即免费使用相关工具
免费使用 →