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



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

我需要在几百万个字符串上生成哈希值。通常,即使对于MD5,发生冲突的机会也应该非常低。我知道MD5很老了,一般来说不被认为是安全的,但在我的情况下,故意攻击不是一个问题(没有外部访问,没有激励等)。我只需要一个相当安全的哈希函数,不会浪费太多的比特,128比特应该足够了。所以我想知道-如果我只得到SHA-1哈希的前128位,这是否比MD5的128位更好?通过"better"我的意思是"不太可能引起碰撞"。

我跑了几个"现实世界";测试4,292,907个不同的字符串。我使用了HEXed散列的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算法的碰撞概率均未显著低于"理论"算法。一个是通过"生日悖论概率"计算出来的。公式。我知道这个测试并不完美,应该持保留态度,但至少对我来说,它表明我可以通过"理论"计算碰撞几率。我担心我的计算与事实相差太远。

相关内容

  • 没有找到相关文章

最新更新