Hash 算法 SHA-1、SHA-256、SHA-384、SHA-512 对比
JavaScript 实现
在线 JavaScript Hash 工具:
https://nanojs.net/tool/hash/sha-256
(通过 Web Crypto API 在浏览器端实现 hash 算法,无后台,隐私安全)
JavaScript Web Crypto API 实现 Hash
// 转为 16 进制
const bufferToHex = (buffer) => {const byteArray = new Uint8Array(buffer);return Array.from(byteArray).map(byte => byte.toString(16).padStart(2, '0')).join('');
};const textInput = "hello";
const encoder = new TextEncoder();
const data = encoder.encode(textInput);const hashAlgorithm = "SHA-256"; // 还支持 SHA-1 SHA-384 SHA-512
const hashBuffer = crypto.subtle.digest(hashAlgorithm, data);
const hashHex = bufferToHex(hashBuffer);
特性对比
特性 | SHA-1 | SHA-256 | SHA-384 | SHA-512 |
---|---|---|---|---|
输出长度 | 160 位 (20 字节) | 256 位 (32 字节) | 384 位 (48 字节) | 512 位 (64 字节) |
输入分块大小 | 512 位 | 512 位 | 1024 位 | 1024 位 |
迭代轮数 | 80 | 64 | 80 | 80 |
内部状态 | 5 × 32 位字 | 8 × 32 位字 | 8 × 64 位字 | 8 × 64 位字 |
安全性 | 已被攻破(可生成碰撞) | 安全(暂无实际碰撞) | 非常安全(基于 SHA-512 截断) | 非常安全(无已知弱点) |
性能表现 | 速度快,安全性差 | 安全性与性能平衡良好 | 在 64 位系统上效率高 | 在 64 位系统上效率高 |
常见用途 | 旧系统、非安全校验 | TLS、区块链、文件校验 | 高安全签名、HMAC | 高安全需求、长摘要、HMAC |
当前状态 | 已弃用 | 推荐使用 | 推荐高安全场景使用 | 推荐高安全场景使用 |
安全性 (最重要的区别)
-
SHA-1 (不安全) :
- 已于 2005年 被密码学家从理论上证明其抗碰撞性不足。
- 2017年,谷歌成功实施了 SHAttered 攻击,公开演示了制造两个具有相同 SHA-1 哈希值的不同 PDF 文件,正式宣告其被实际攻破。
- 结论:绝对不能再用于任何安全相关的用途,如数字证书、密码散列或完整性验证。
-
SHA-256 / SHA-384 / SHA-512 (安全) :
- 同属于 SHA-2 家族,目前尚未有任何成功的攻击方法能威胁到其核心安全性。
- 它们的抗碰撞性基于其输出长度(256位、384位、512位),在可预见的未来(即使量子计算机出现)都是安全的。
- SHA-256 是目前行业内的黄金标准和最广泛采用的算法。
- SHA-384 和 SHA-512 提供更高的安全边际,适用于对安全寿命要求极高的场景。
输出长度与抗碰撞性
-
输出长度直接决定了哈希空间的“大小”,是抗碰撞性的基础。
-
生日攻击 理论指出,找到碰撞大约需要尝试
2^(n/2)
次,其中n
是输出位数。- SHA-1 (n=160) : 理论上需要 ~2⁸⁰ 次尝试,但已被更高效的方法攻破。
- SHA-256 (n=256) : 需要 ~2¹²⁸ 次尝试,在计算上不可行。
- SHA-384 (n=384) : 需要 ~2¹⁹² 次尝试,极其安全。
- SHA-512 (n=512) : 需要 ~2²⁵⁶ 次尝试,目前最顶级的安全性。
性能考虑
-
SHA-1 因其设计简单,计算速度最快,但因其不安全,速度优势已无意义。
-
SHA-256 在 32 位和 64 位系统上都有良好的性能表现,是安全与效率的完美平衡。
-
SHA-384 和 SHA-512 内部使用 64 位字进行计算。
- 在 64 位 CPU 上,SHA-512 的速度通常比 SHA-256 更快,因为它能更高效地处理更大的数据块。
- 在 32 位 CPU 上,它们通常会慢一些。
兼容性与应用
-
SHA-1: 仅存在于旧系统、旧协议中(如旧版 Git),用于向后兼容。所有现代安全标准已强制要求弃用。
-
SHA-256: 无处不在。是大多数应用的首选:
- 比特币 和许多其他加密货币的挖矿和交易验证。
- TLS/SSL 证书 的标准算法。
- 软件更新包的完整性校验。
- 密码散列(通常与盐值 Salt 结合使用)。
-
SHA-384 / SHA-512: 用于需要更高安全级别的特定场景:
- 某些政府机构和军事应用的标准要求。
- 保护极其敏感或需要长期(数十年)安全的数据。
如何选择?—— 实践指南
-
对于所有新项目和安全应用:
- 首选
SHA-256
。它提供了最佳的安全性和广泛支持的平衡,是事实上的标准。
- 首选
-
对于有更高安全要求或遵循特定标准的情况:
- 选择
SHA-384
或SHA-512
。例如,SHA-384 是 FIPS 180-4 标准中推荐用于保护 128 位安全级别的算法。
- 选择
-
绝对禁止:
- 永远不要 在新的项目中使用
SHA-1
用于安全目的。如果遇到旧系统在使用,应制定计划立即迁移到 SHA-2 家族。
- 永远不要 在新的项目中使用
-
性能考量:
- 如果在 64 位服务器上进行大量哈希计算,测试一下
SHA-512
,它可能比SHA-256
更快。
- 如果在 64 位服务器上进行大量哈希计算,测试一下
示例
对字符串 "hello"
进行哈希计算的结果:
算法 | 哈希值 (十六进制) |
---|---|
SHA-1 | aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d |
SHA-256 | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 |
SHA-384 | 59e1748777448c69de6b800d7a33bbfb9ff1b463e44354c3553bcdb9c666fa90125a3c79f90397bdf5f6a13de828684f |
SHA-512 | 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043 |
结论
对于绝大多数情况,使用 SHA-256 就对了。它是安全、高效且行业公认的标准。如果需要更安全的算法可以用 SHA-384 SHA-512
总结:
- SHA-1 已经不安全,仅适合非安全校验或兼容旧系统。
- SHA-256 是目前最常用的安全哈希算法,性能和安全性均衡。
- SHA-384 基于 SHA-512,提供更长摘要,适合高安全需求。
- SHA-512 在 64 位平台上性能优异,适合需要最高安全性的应用。