安全哈希算法
过去曾提出过许多密码学哈希算法,软件开发者也广泛使用过它们。其中一些已被攻破,如 MD5 和 SHA1;另一些仍被认为是安全的,如 SHA-2、SHA-3 和 BLAKE2。下面介绍应用最广泛的密码学哈希函数(算法)。
安全哈希函数
现代密码学哈希算法(如 SHA-3 和 BLAKE2)被认为对大多数应用而言足够安全。
SHA-2、SHA-256 与 SHA-512
SHA-2 是一个强密码学哈希函数家族,包括 SHA-256(256 位哈希)、SHA-384(384 位哈希)、SHA-512(512 位哈希)等。它基于密码学概念“Merkle–Damgård 构造”,被认为具有很高的安全性。SHA-2 已在美国作为官方密码学标准发布。
开发者和密码学领域广泛使用 SHA-2,并认为它对现代商业应用具有足够的密码学强度。
SHA-256 广泛用于 Bitcoin 区块链,例如标识交易哈希,以及执行矿工的工作量证明挖矿。
SHA2 哈希示例:
SHA-256('hello') = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-384('hello') = 59e1748777448c69de6b800d7a33bbfb9ff1b463e44354c3553bcdb9c666fa90125a3c79f90397bdf5f6a13de828684f
SHA-512('hello') = 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
哈希位数越多,抗碰撞性越高
在设计上,通常预期哈希输出位数越多,安全性和抗碰撞能力就越强,但也有例外。一般而言,128 位哈希函数弱于 256 位哈希函数,而 256 位哈希函数又弱于 512 位哈希函数。
因此,SHA-512 比 SHA-256 更强;在实践中,SHA-512 发生碰撞的可能性预计比 SHA-256 更低。
SHA-3、SHA3-256、SHA3-512 与 Keccak-256
在哈希长度相同的情况下,SHA-3(及其变体 SHA3-224、SHA3-256、SHA3-384、SHA3-512)被认为比 SHA-2(SHA-224、SHA-256、SHA-384、SHA-512)更安全。例如,在相同的 256 位哈希长度下,SHA3-256 提供的密码学强度高于 SHA-256。
SHA-3 函数家族属于“Keccak”哈希家族,基于密码学概念“海绵构造”。Keccak 是 NIST SHA-3 竞赛的获胜者。
与 SHA-2 不同,SHA-3 密码学哈希函数家族不受“长度扩展攻击”影响。
SHA-3 被认为具有很高的安全性,并已在美国作为官方推荐的密码学标准发布。
Keccak-256 哈希函数用于以太坊区块链,它是 SHA3-256 的一个变体,代码中的某些常量有所不同。
哈希函数 SHAKE128(msg, length) 和 SHAKE256(msg, length) 分别是 SHA3-256 和 SHA3-512 算法的变体,其输出消息长度可变。
SHA3 哈希示例:
SHA3-256('hello') = 3338be694f50c5f338814986cdf0686453a888b84f424d792af4b9202398f392
Keccak-256('hello') = 1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8
SHA3-512('hello') = 75d527c368f2efe848ecf6b073a36767800805e9eef2b1857d5f984f036eb6df891d75f72d9b154518c1cd58835286d1da9a38deba3de98b5a53e5ed78a84976
SHAKE-128('hello', 256) = 4a361de3a0e980a55388df742e9b314bd69d918260d9247768d0221df5262380
SHAKE-256('hello', 160) = 1234075ae4a1e77316cf2d8000974581a343b9eb
BLAKE2 / BLAKE2s / BLAKE2b
BLAKE / BLAKE2 / BLAKE2s / BLAKE2b 是一个快速且高度安全的密码学哈希函数家族,可计算 160 位、224 位、256 位、384 位和 512 位摘要,广泛用于现代密码学。BLAKE 是 NIST SHA-3 竞赛的决赛算法之一。
BLAKE2 函数是 BLAKE 的改进版本。
BLAKE2s(通常为 256 位)是针对 32 位微处理器优化性能的 BLAKE2 实现。
BLAKE2b(通常为 512 位)是针对 64 位微处理器优化性能的 BLAKE2 实现。
BLAKE2 哈希函数的安全强度与 SHA-3 相近,但开发者使用它的频率低于 SHA2 和 SHA3。
BLAKE 哈希示例:
BLAKE2s('hello') = 19213bacc58dee6dbde3ceb9a47cbb330b3d86f8cca8997eb00be456f140ca25
BLAKE2b('hello') = e4cfa39a3d37be31c59609e807970799caa68a19bfaa15135f165085e01d41a65ba1e1b146aeb6bd0092b49eac214c103ccfa3a365954bbbe52f74a2b3620c94
RIPEMD-160
RIPEMD-160 是一种安全哈希函数,广泛用于密码学,例如 PGP 和 Bitcoin。
RIPEMD 的 160 位变体在实践中应用广泛,而 RIPEMD-128、RIPEMD-256 和 RIPEMD-320 等其他变体并不常用,其安全强度也存在争议。
建议优先使用 SHA-2 和 SHA-3,而不是 RIPEMD。由于位数更多、碰撞概率更低,它们比 RIPEMD 更强。
RIPEMD 哈希示例:
RIPEMD-160('hello') = 108f07b8382412612c048d07d13f814118445acd
RIPEMD-320('hello') = eb0cf45114c56a8421fbcb33430fa22e0cd607560a88bbe14ce70bdf59bf55b11a3906987c487992
上述常用安全哈希函数(SHA-2、SHA-3、BLAKE2、RIPEMD)均不受商业专利限制,公众可以免费使用。
不安全的哈希函数
MD5、SHA-0 和 SHA-1 等旧式哈希算法因存在密码学弱点(已找到碰撞)而被视为不安全并已停用。不要使用 MD5、SHA-0 或 SHA-1! 这些哈希函数都已被证明在密码学上不安全。
你可以在互联网上找到实际生成 SHA1 碰撞的案例。这会导致创建伪造数字签名的算法:两份内容不同的已签名 PDF 文档拥有相同的哈希值和数字签名。参见 https://shattered.io。
应避免使用以下被视为不安全或安全性存在争议的哈希算法:MD2、MD4、MD5、SHA-0、SHA-1、Panama、HAVAL(安全性存在争议,已发现 HAVAL-128 碰撞)、Tiger(存在争议,已发现弱点)、SipHash(它不是密码学哈希函数)。
其他安全哈希函数
以下函数是常用的强密码学哈希函数,可作为 SHA-2、SHA-3 和 BLAKE2 的替代选择:
- Whirlpool 是一种安全密码学哈希函数,生成 512 位哈希。
- SM3 是由中国政府正式标准化的密码学哈希函数。它与 SHA-256 类似,基于 Merkle–Damgård 构造,生成 256 位哈希。
- GOST(GOST R 34.11-94)是一种安全密码学哈希函数,也是俄罗斯国家标准,在 RFC 4357 中有相应说明。它生成 256 位哈希。
以下函数是不太常用的 SHA-2、SHA-3 和 BLAKE 替代方案,均为 NIST SHA-3 竞赛的决赛算法:
- Skein 是一种安全密码学哈希函数,可派生 128、160、224、256、384、512 和 1024 位哈希。
- Grøstl 是一种安全密码学哈希函数,可派生 224、256、384 和 512 位哈希。
- JH 是一种安全密码学哈希函数,可派生 224、256、384 和 512 位哈希。
SHA-256、SHA3-256、BLAKE2s 和 RIPEMD-160 尚无已知碰撞
截至 2018 年 10 月,SHA256、SHA3-256、Keccak-256、BLAKE2s、RIPEMD160 等函数均没有已知碰撞。
通常,通过暴力破解寻找哈希函数碰撞的成本为:SHA256 / SHA3-256 需要 2^128,RIPEMD160 需要 2^80。
相应地,在足够强大的量子计算机上,所需时间会更少:分别为 2^(256/3) 和 2^(160/3)。尽管如此,截至 2018 年 9 月,尚不存在已知的如此强大的量子计算机。
有关密码学哈希函数、其强度和抗攻击能力的更多信息,请参阅:https://z.cash/technology/history-of-hash-function-attacks.html