128位的SHA-1哈希比MD5哈希更安全吗?

4

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

我需要在数百万个字符串上生成哈希值。通常情况下,即使对于MD5,发生碰撞的概率也应该非常低。我知道MD5很古老,在一般情况下不被认为是安全的,但在我的情况下,故意攻击并不是一个问题(没有外部访问、没有激励等)。我只需要一个合理安全的哈希函数,而不浪费太多位,128位应该足够了。所以我想知道 - 如果我只得到SHA-1哈希的前128位,是否比MD5的128位更好? "更好"的意思是“发生碰撞的可能性更小”。


2
如果MD5对于您的特定用例“足够好”-那就使用它吧! 如果您可以负担得起使用SHA-1(160位)或SHA-256:太棒了! 但是截断您的SHA-1哈希? 可能不是一个好主意。 在这里查看:https://dev59.com/em445IYBdhLWcg3wmLZd#4784437 或者在这里:[Project HashClash](https://marc-stevens.nl/p/hashclash/) - paulsm4
1
不,对于非安全哈希表/映射应用程序,SHA1截断为128位与MD5或MD4没有任何区别。它们都是过度杀伤力的。另一方面,如果哈希洪泛攻击是可能的,那么SipHash是值得研究的东西。 - President James K. Polk
1个回答

4

我进行了几项“真实世界”的测试,使用了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都没有显示出明显更糟糕的碰撞概率。我知道这个测试并不完美,应该持谨慎态度,但至少对我来说,它表明我可以大量依赖通过“理论”公式计算碰撞几率,而不必担心我的计算距离真相太远。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接