MD5,SHA-256,SHA-3 您实际上需要哪种哈希算法?
MD5、SHA-1、SHA-256、SHA-3 和 BLAKE3 的直接对比——在何种情况下使用每个算法、它们的局限性,以及默认应选用哪个算法。
如果您仍然默认使用MD5,您并不孤单——但您可能做出了错误的选择。所有哈希函数都会生成数据的固定长度指纹,但它们并非可以互换。选择错误的算法要么是过度谨慎,要么是真正的安全失败,具体取决于您判断的方向。
以下内容将详细介绍每个算法的实际作用、其缺陷以及您应该选择的替代方案。
哈希函数的作用
密码学哈希函数可以接受任意大小的输入,并返回固定长度的输出——具有确定性、单向性(理想情况下还具有抗碰撞性)。相同的输入始终生成相同的哈希值。无法逆向推导,且输入中哪怕只改变一个字节,输出也会完全改变。
这三种特性使哈希函数在验证数据完整性、签署文档和构建校验和方面非常有用。以下所有算法都具备这些功能。它们之间的区别在于对攻击的抵抗力以及运行速度。
MD5:停止在安全领域使用它
MD5生成128位哈希值,运行速度快——这正是问题所在。它于1991年设计,到2004年研究人员已证明其存在碰撞攻击。如今,生成两个不同文件却拥有相同MD5哈希值在计算上是完全可行的。
其失败场景: 任何安全场景——通过不可信通道进行的文件完整性校验、数字签名、TLS证书。
其仍适用的场景: 非安全校验和。文件去重、生成缓存键、在您控制的系统内对内容进行指纹识别——MD5速度快且足够好。只有当攻击者可以利用碰撞时,才需要担心。
需要快速生成MD5哈希值吗?请使用 MD5生成器.
SHA-1:已弃用,但仍存在
SHA-1生成160位输出,具有同样的根本问题:已存在碰撞攻击。谷歌在2017年的SHAttered攻击中生成了两个不同的PDF文件,其SHA-1哈希值相同,攻击成本如今已对有动机的攻击者而言是可负担的。
它已被正式弃用于数字签名和TLS证书。您仍可能在Git中发现它,作为内容标识符使用——该场景下的威胁模型不同,且Git正在积极向SHA-256迁移。
规则: 不要在新的安全敏感任务中使用SHA-1。在旧系统中将其标记为迁移对象。
SHA-256和SHA-512:当前标准
SHA-256(属于SHA-2家族)是大多数密码学应用的默认选择。输出为256位,目前没有已知的实用攻击,且在几乎所有您可能使用的编程语言和平台上均得到支持。
SHA-512使用512位内部状态并生成512位输出。在64位CPU上,由于其处理块的方式,它通常 更快 处理大输入数据,相较于SHA-256。对于大多数应用层工作,SHA-256已足够。如果您需要高吞吐量数据处理或在密钥派生中需要额外的安全余量,请进行性能测试以评估SHA-512。
使用场景: 文件完整性校验、HMAC、证书签名(使用RSA/ECDSA)、API请求签名、JWT令牌。
SHA-3:不同架构,特定用途
SHA-3(Keccak)于2015年被NIST选定,作为SHA-2的结构替代方案。SHA-2采用Merkle-Damgård构造,而SHA-3采用海绵构造。如果未来在SHA-2设计中发现根本性弱点,SHA-3将不受影响。
它生成相同长度的输出(SHA3-256、SHA3-512等),并通过了当前所有安全分析,但在纯软件环境下通常比SHA-256运行更慢。
使用场景: 在需要与SHA-2架构独立的长期密码系统中——如硬件安全模块、某些政府或合规场景,或任何明确希望防范未来SHA-2弱点的场景。对于大多数网络应用而言,这属于理论上的过度设计。
BLAKE3:现代性能选择
BLAKE3尚未成为NIST标准,但其采用度很高:Rust的 cargo、Bao流式哈希格式,以及越来越多的安全和存储工具均使用它。它专为并行处理设计,在软件中运行速度显著快于SHA-256,同时在当前密码学分析下表现稳定。
使用场景: 高性能校验和、内容寻址、在您完全控制两端且需要速度而不牺牲安全性的场景。避免在SHA-2被明确要求的场景中使用它——如X.509证书、JWT等标准定义场景。
哈希算法对比
| Algorithm | 安全性状态 | 输出长度 | 软件运行速度 | 使用场景 |
|---|---|---|---|---|
| MD5 | 已损坏(碰撞) | 128位 | 非常快 | 非安全校验和、去重 |
| SHA-1 | 已损坏(碰撞) | 160位 | 快 | 仅限遗留系统;Git内容标识符 |
| SHA-256 | 安全的 | 256位 | 快 | 通用用途——默认选择 |
| SHA-512 | 安全的 | 512位 | 在64位系统上处理大数据时更快 | 高吞吐量或需要额外安全余量 |
| SHA-3 | 安全的 | 224–512位 | 在软件中运行较慢 | 需要与SHA-2架构独立的长期系统 |
| BLAKE3 | 安全的 | 256位 | 非常快(支持并行) | 性能关键的内容寻址 |
计算SHA-256
计算SHA-256哈希的三种快速方法:
Python:
import hashlib
data = b"hello world"
digest = hashlib.sha256(data).hexdigest()
print(digest)
# Output: b94d27b9934d3e08a52e52d7da7dabfac484efe04294e576fba1d63e8d4d0b4b
Node.js:
const { createHash } = require('crypto');
const digest = createHash('sha256')
.update('hello world')
.digest('hex');
console.log(digest);
Bash:
echo -n "hello world" | sha256sum
如果需要快速计算哈希值而无需编写代码呢? 哈希生成器 支持MD5、SHA-1、SHA-256、SHA-512等——直接从您的浏览器即可使用。
决策指南
| 使用场景 | 应使用什么算法 |
|---|---|
| 去重/缓存键 | MD5或SHA-256 |
| 文件完整性(可信通道) | MD5可以接受 |
| 文件完整性(下载、不可信来源) | SHA-256 |
| 数字签名 | SHA-256或SHA-512 |
| HMAC和API认证 | SHA-256 |
| TLS证书 | SHA-256 |
| 密码存储 | bcrypt、Argon2或scrypt——而不是上述任何一种 |
| 高性能内容寻址 | BLAKE3 |
| 标准合规性 | SHA-256(请检查具体要求) |
有一点需要明确:这些算法均不应直接用于密码哈希。它们的设计都是快速的,这使其容易受到暴力破解攻击。应使用bcrypt、Argon2id或scrypt——这些算法被设计为故意缓慢且内存密集,正是因为密码破解本质上是敌对行为。
简明答案
对于新代码: 默认使用SHA-256。 如果需要更大的输出长度或在64位硬件上处理大量数据流,请使用SHA-512。在需要高吞吐量且两端均可控制的场景中,请使用BLAKE3。只有在有明确架构原因需要独立于SHA-2时,才使用SHA-3。
MD5适用于内部指纹识别和去重,前提是碰撞不会构成安全问题。它不适用于任何可能让攻击者利用伪造匹配的场景。
如有疑问,请选择SHA-256。它已正确解答了十年问题,未来可预见的时期内仍将如此。
