← 返回博客

SHA256 vs MD5:安全性与速度对比

2026-04-04 · 5 分钟阅读

核心差异概览

Feature          MD5              SHA256
Output bits      128 bits         256 bits
Hex characters   32               64
Year created     1991             2001
Designed by      Ronald Rivest    NSA
Security status  BROKEN           SECURE
Collision resist NONE             2^128 ops
Speed (relative) ~1x (fastest)   ~2-3x slower
Use case         Non-security     Security-critical

输出长度差异

MD5 产生 128 位(32 个十六进制字符)的哈希,SHA256 产生 256 位(64 个十六进制字符)的哈希。更长的输出意味着更大的哈希空间,碰撞的可能性指数级降低。MD5 的哈希空间约 3.4 × 10 的 38 次方种,SHA256 的哈希空间约 1.16 × 10 的 77 次方种,是 MD5 的约 3.4 × 10 的 38 次方倍。

安全性对比

这是两者之间最关键的区别:MD5 的碰撞抗性已经被彻底破坏。2004 年发现的碰撞攻击可以在普通计算机上秒级找到 MD5 碰撞,2008 年研究者用此成功伪造 CA 证书。MD5 也容易受到长度扩展攻击(Length Extension Attack)。相比之下,SHA256 没有已知的可行攻击方法。其抗碰撞强度约为 2 的 128 次方,预像攻击强度约为 2 的 256 次方,都远超现实可行的计算能力。

速度对比

MD5 比 SHA256 快约 2–3 倍(在软件实现上)。这在某些高吞吐量、非安全场景中很重要。然而,对于安全场景,算法"太快"反而是弱点——因为快速意味着攻击者可以更快地暴力破解或遍历彩虹表。

// Benchmark comparison (approximate, on modern hardware)
MD5:    ~800 MB/s per CPU core
SHA256: ~300 MB/s per CPU core (software)
SHA256: ~3000+ MB/s with hardware acceleration (AES-NI equivalent)

值得注意的是,现代 CPU(Intel Goldmont 及之后)内置了 SHA256 硬件加速指令,使 SHA256 的速度可以超过纯软件 MD5。

何时用 MD5,何时用 SHA256

迁移旧 MD5 代码到 SHA256

如果你的系统中有使用 MD5 进行安全操作的旧代码,迁移到 SHA256 通常是直接替换:

// Before (insecure)
const crypto = require('crypto');
const hash = crypto.createHash('md5').update(data).digest('hex');

// After (secure)
const hash = crypto.createHash('sha256').update(data).digest('hex');

// Python before
import hashlib
hash = hashlib.md5(data).hexdigest()

// Python after
hash = hashlib.sha256(data).hexdigest()

迁移时需要注意的是数据库中已存储的哈希值——这些无法直接转换。通常需要在用户下次登录时重新哈希,或者运行一次性的迁移脚本处理文件哈希值。

两者的共同点

立即免费使用相关工具

免费使用 →