← 返回博客

MD5 vs SHA1 vs SHA256:该用哪个

2026-04-06 · 5 分钟阅读

三种算法对比速览

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。

各算法在各场景的推荐

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)

立即免费使用相关工具

免费使用 →