哈希算法比较:MD5、SHA-1、SHA-256 及更多
加密哈希函数是现代计算的基础。它们用于验证文件完整性、保护密码、认证消息,并支撑区块链技术。但并非所有哈希算法都一样。本指南比较了最广泛使用的算法,帮助你做出正确选择。
什么是哈希函数?
哈希函数接收任意大小的输入,产生固定长度的输出("摘要"或"哈希")。好的哈希函数具有三个关键属性:
- 确定性:相同输入始终产生相同输出
- 雪崩效应:输入的微小变化完全改变输出
- 单向性:计算上不可行将哈希逆向还原为输入
这些属性使哈希在数据完整性验证和安全应用中无可替代。
算法比较
| 算法 | 输出大小 | 速度 | 安全状态 | 现在可用? |
|---|---|---|---|---|
| MD5 | 128 位 | 非常快 | 已破解 | 仅用于校验和 |
| SHA-1 | 160 位 | 快 | 已破解 | 否 |
| SHA-256 | 256 位 | 中等 | 安全 | 是 |
| SHA-384 | 384 位 | 中等 | 安全 | 是 |
| SHA-512 | 512 位 | 64 位系统快 | 安全 | 是 |
| SHA-3-256 | 256 位 | 中等 | 安全 | 是 |
| BLAKE2b | 256-512 位 | 非常快 | 安全 | 是 |
| BLAKE3 | 256 位 | 极快 | 安全 | 是 |
MD5:已破解的标准
MD5 由 Ronald Rivest 于 1991 年设计,产生 128 位哈希。十多年来,它是校验和和完整性验证的默认选择。
MD5 为何被破解:2004 年,研究人员展示了实际的碰撞攻击——找到两个产生相同哈希的不同输入。到 2008 年,研究人员利用 MD5 碰撞创建了一个伪造的 CA 证书。如今,在消费级硬件上几秒内就能找到碰撞。
MD5 仍然可接受的场景:非安全性校验和,如验证文件下载,其中不关心被篡改。对于任何与安全相关的用途,请完全避免 MD5。
SHA-1:已弃用但仍残留
SHA-1 由 NSA 设计,1995 年发布,产生 160 位哈希。多年来它取代了 MD5 成为标准。
SHA-1 为何被破解:Google 和 CWI Amsterdam 在 2017 年展示了实际碰撞("SHAttered"攻击)。主要浏览器在 2017 年取消了对 SHA-1 证书的支持。Git 最初使用 SHA-1 作为提交哈希,正在过渡到 SHA-256。
当前状态:所有安全用途均已弃用。如果你在遗留系统中遇到 SHA-1,请规划向 SHA-256 或 SHA-3 的迁移路径。
SHA-256:当前标准
SHA-256 属于 SHA-2 家族,由 NSA 设计,2001 年发布。它产生 256 位哈希,是目前使用最广泛的安全哈希算法。
安全性:目前没有发现针对 SHA-256 的实际攻击。它提供 128 位的碰撞抵抗力,这被认为在可预见的未来是足够的。
性能:SHA-256 比 MD5 和 SHA-1 慢,在用于密码哈希时这实际上是一个优点(越慢 = 越难暴力破解)。在具有硬件加速(SHA-NI 指令)的现代 CPU 上,性能出色。
SHA-256 的使用场景:
- TLS/SSL 证书
- 比特币挖矿
- 数字签名
- 代码签名
- 文件完整性验证
使用我们的 哈希生成器 即时生成 SHA-256 哈希。
SHA-3:替代标准
SHA-3 基于 Keccak 算法,在 2012 年赢得了 NIST 的哈希函数竞赛。它使用与 SHA-2 完全不同的内部结构(海绵结构)。
SHA-3 的重要性:如果数学突破使 SHA-2 受损,SHA-3 提供了一个完全独立的后备方案。其不同的设计意味着 SHA-2 中的漏洞不太可能影响 SHA-3。
采用情况:SHA-3 的采用速度比预期慢,因为 SHA-2 仍未被破解。它在区块链应用和纵深防御架构中的辅助哈希中被越来越多地使用。
BLAKE2 和 BLAKE3:速度冠军
BLAKE2(2012)和 BLAKE3(2020)是为性能设计的现代哈希函数,不牺牲安全性。
BLAKE3 亮点:
- 在现代 CPU 上比 MD5 更快
- 天生并行(随 CPU 核心数扩展)
- 256 位输出
- 内置支持带密钥哈希和密钥派生
对于速度至关重要且不受限于 NIST 标准的应用,BLAKE3 是一个极好的选择。
选择正确的算法
密码哈希
不要直接使用以上任何算法。使用专用的密码哈希函数:Argon2id(密码哈希竞赛的获胜者)、bcrypt 或 scrypt。这些函数被故意设计为慢速且内存密集型,以抵抗暴力攻击。在我们的 密码安全指南 中了解更多。
文件完整性
SHA-256 是标准选择。如果性能至关重要且你控制两端,BLAKE3 更快且同样安全。
数字签名
SHA-256 或 SHA-384,取决于所需的安全级别。政府和金融应用通常要求 SHA-384 或 SHA-512。
校验和(非安全用途)
不关心安全性时使用 CRC32 或 xxHash 追求速度。如果需要加密保证,SHA-256 是最低要求。
区块链应用
SHA-256(比特币)、Keccak-256(以太坊)或 BLAKE2b(Zcash)。选择通常取决于特定协议的要求。
哈希碰撞解释
碰撞发生在两个不同输入产生相同哈希输出时。生日悖论意味着碰撞被发现的速度比你预期的要快得多:
- 对于 128 位哈希(MD5),碰撞大约需要 2^64 次运算
- 对于 256 位哈希(SHA-256),碰撞大约需要 2^128 次运算
这种指数级差异就是为什么哈希长度翻倍远不止提供两倍的安全性。
实际示例
同一输入在不同算法下的结果:
Input: "Hello, World!"
MD5: 65a8e27d8879283831b664bd8b7f0ad4
SHA-1: 0a0a9f2a6772942557ab5355d76af442f8f65e01
SHA-256: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
使用我们的 哈希生成器 亲自生成这些。所有计算都在你的浏览器中完成——你的数据保持私密。
常见问题
SHA-256 能抵抗量子计算吗?
SHA-256 部分抵抗量子攻击。Grover 算法可能将原像攻击的有效安全性从 256 位降低到 128 位,这仍然被认为是安全的。对于碰撞抵抗,量子计算机的优势较小。后量子密码学标准更关注加密和签名而非哈希函数。
我应该使用 SHA-512 而不是 SHA-256 以获得更高安全性吗?
对于大多数应用,SHA-256 提供了足够的安全性。SHA-512 由于其内部结构,在 64 位处理器上实际上更快,因此出于性能原因可以是一个好选择。额外的哈希长度提供了附加的碰撞抵抗力,但很少是决定性因素。