128 位的 SHA-1 散列是不是比 MD5 散列更安全?

Posted

技术标签:

【中文标题】128 位的 SHA-1 散列是不是比 MD5 散列更安全?【英文标题】:Are 128 bits of SHA-1 hash safer than an MD5 hash?128 位的 SHA-1 散列是否比 MD5 散列更安全? 【发布时间】:2021-12-11 08:34:38 【问题描述】:

SHA-1 被认为比 MD5 更安全,至少有两个原因:更大的哈希(160 位与 128 位)和更好的哈希函数。

我需要在几百万个字符串上生成散列。通常,即使对于 MD5,发生碰撞的可能性也应该非常低。我知道 MD5 已经很老了,通常不被认为是安全的,但在我的情况下,故意攻击不是问题(没有外部访问,没有激励等)。我只需要一个相当安全的散列函数,不会浪费太多位,128 位应该绰绰有余。所以我想知道 - 如果我只得到 SHA-1 哈希的前 128 位,那会比 MD5 的 128 位更好吗? “更好”是指“不太可能导致碰撞”。

【问题讨论】:

如果 MD5 对于您的特定用例来说“足够好” - 去吧!如果您负担得起使用 SHA-1(160 位)或 SHA-256:太好了!但是截断你的 SHA-1 哈希?可能不是一个好主意。看这里:***.com/a/4784437/421195 或这里:Project Hash*** 不,对于非安全哈希表/映射应用程序,SHA1 截断为 128 位并不比 MD5 好,或者就此而言 MD4。对于该应用程序,它们都是核杀伤力过大的。另一方面,如果哈希泛洪攻击是一种可能性,SipHash 是值得研究的。 【参考方案1】:

我用 4,292,907 个不同的字符串进行了一些“真实世界”测试。我使用了一个 11 字符长的十六进制散列子字符串(换句话说,一个 44 位部分)。示例:

  HASH: 629a09633488e9b2aaf2f5a606706da3
Test 1: 629a0963348
Test 2:  29a09633488
Test 3:   9a09633488e
...

理论上,我计算出的碰撞概率约为 41%(基于“生日悖论概率”公式)。但那是理论,它假设真正的随机分布。所以我想凭经验测试 MD5 和 SHA-1 并查看结果。它们在这里(右边的数字表示碰撞次数):

[MD5]             [SHA-1]
Test No  1: 2     Test No  1: 0
Test No  2: 0     Test No  2: 0
Test No  3: 1     Test No  3: 0
Test No  4: 0     Test No  4: 1
Test No  5: 0     Test No  5: 0
Test No  6: 0     Test No  6: 1
Test No  7: 1     Test No  7: 0
Test No  8: 2     Test No  8: 0
Test No  9: 1     Test No  9: 0
Test No 10: 1     Test No 10: 0
Test No 11: 0     Test No 11: 1
Test No 12: 0     Test No 12: 1
Test No 13: 0     Test No 13: 0
Test No 14: 0     Test No 14: 1
Test No 15: 0     Test No 15: 1
Test No 16: 0     Test No 16: 1
Test No 17: 1     Test No 17: 1
Test No 18: 1     Test No 18: 1
Test No 19: 0     Test No 19: 0
Test No 20: 0     Test No 20: 1
TOTAL: 8          TOTAL: 10           // No of tests with at least 1 collision

结论:与通过“生日悖论概率”公式计算的“理论”概率相比,MD5 和 SHA-1 的碰撞概率均未显着降低。我知道这个测试并不完美,应该用一粒盐来进行,但至少对我来说,它表明我可以严重依赖于通过“理论”公式计算碰撞的机会而不必担心我的计算与事实相去甚远。

【讨论】:

以上是关于128 位的 SHA-1 散列是不是比 MD5 散列更安全?的主要内容,如果未能解决你的问题,请参考以下文章

网络安全-哈希算法和数字签名

单向散列算法的常见算法

网络安全-安全散列函数,信息摘要SHA-1,MD5原理

Android常见的加密算法

MD5、SHA1、CRC32值是干啥的?

什么是安全散列算法SHA256