【问题标题】:Probability of hash collision哈希冲突的概率
【发布时间】:2020-10-21 04:31:29
【问题描述】:

我正在寻找一些基于生日悖论的关于 MD5、SHA1 和 SHA256 冲突可能性的精确数学。

我正在寻找类似图表的东西,上面写着“如果你有 10^8 个键,这就是概率。如果你有 10^13 个键,这就是概率等等”

我查看了大量文章,但很难找到能够提供这些数据的内容。 (对我来说,理想的选择是计算任何提供的哈希大小的公式或代码)

【问题讨论】:

  • 为什么?例如,对于 MD5(以及一定程度上的 SHA-1),它在很大程度上取决于您的输入是什么。 MD5 已知碰撞攻击,因此如果恶意用户控制(部分)散列算法的输入,那么这会显着影响碰撞的可能性。对于理论上的下限,完美的散列算法的行为应该与完美的随机数生成器没有什么不同。
  • 主要是出于好奇。我应该澄清一下,我正在寻找基于 128 位、160 位和 256 位等密钥大小的完美哈希的理论哈希冲突概率。
  • 这一切都在wikipediawikipedia 上。
  • @DarkNebula,是的,这是一个重要的澄清,因为从数学上讲,这是一个更容易的问题。
  • 我邀请您在bdayprob.com 试用我的计算器,它允许在日志 2 中输入。例如,测试与 10^8 ≈ (2^(3.36))^8 = 碰撞的可能性SHA256 中的 2^(26.56)

标签: math hash probability sha birthday-paradox


【解决方案1】:

假设我们有一个真正的随机散列函数,可以从字符串散列到 n 位数字。这意味着有 2n 个可能的哈希码,并且每个字符串的哈希码都是从所有这些可能性中均匀随机选择的。

生日悖论明确表示,一旦您看到大约 √(2k) 个项目,就有 50% 的机会发生碰撞,其中 k 是不同的可能输出的数量。在散列函数散列到 n 位输出的情况下,这意味着在发生冲突之前您将需要大约 2n/2 个散列。这就是为什么我们通常选择输出 256 位的散列;这意味着我们需要一个惊人的 2128 ≈1038 项散列,然后才有“合理”的碰撞机会。使用 512 位哈希,您需要大约 2256 才能获得 50% 的碰撞机会,而 2256approximately the number of protons in the known universe

与一个 n 位散列函数和 k 个散列的字符串发生冲突的概率的确切公式是

1 - 2n! / (2kn (2n - k)!)

这是一个很难直接处理的量,但我们可以使用表达式得到这个量的近似值

1 - e-k2/2n+1

所以,为了得到(大致)碰撞概率 p,我们可以求解得到

p ≈ 1 - e-k2/2n+1

1 - p ≈ e-k2/2n+1

ln(1 - p) ≈ -k2/2n+1

-ln(1 - p) ≈ k2/2n+1

-2n+1 ln(1 - p) ≈ k2

2(n+1)/2 √(-ln(1 - p)) ≈ k

作为最后一个近似值,假设我们正在处理 非常 个很小的 ​​p 选择。那么 ln(1 - p) ≈ -p,所以我们可以重写为

k ≈ 2(n+1)/2 √p

注意这里还有一个怪物 2(n+1)/2 项,所以对于 256 位哈希,前导项是 2128.5,即只是巨大的。例如,我们必须看到多少项才能获得 2-50 的机会与 256 位哈希发生冲突?那大约是

2(256+1)/2 √2-50

= 2257/2 2-50/2

= 2207/2

= 2103.5.

因此,您需要惊人地 大量的哈希值才能有几乎 小概率发生冲突。图 2103.5 大约是 1031,在计算每个哈希值 1 纳秒的情况下,这将花费您比计算宇宙的长度更长的时间。毕竟,你会得到 2-50 的成功概率,大约是 10-15

事实上,这正是我们为哈希选择如此大量位的原因!这使得偶然发生碰撞的可能性极小。

(请注意,我们今天拥有的哈希函数实际上并不是真正的随机函数,这就是为什么人们建议不要使用 MD5、SHA1 和其他已经暴露安全漏洞的函数。)

希望这会有所帮助!

【讨论】:

  • 很棒的答案!尽管最后的括号在技术上超出了问题的范围,但我个人还是会多强调一点,因为这意味着纯粹根据输出的大小来判断散列算法是一个坏主意,因为它们是已知实际上并不是完美的。
  • 这太棒了,它给出了我正在寻找的精确数学,我可以很容易地为任何自定义值计算出来。我还想引用另一条评论 (en.wikipedia.org/wiki/Birthday_problem#Probability_table) 中提到的维基百科文章,其中显示了一些一般价值。
  • “与 n 位哈希发生冲突的概率的确切公式......”不,这不是生日悖论的公式。你这里的公式正好相反;不发生任何碰撞的概率是多少。
  • @foki 感谢您的关注!原来我在这里有两个单独的错误被取消了。首先,有你指出的那个。其次,我给出的近似值不是我写的数量的近似值,而是我打算写的数量。因此,修复原始公式使所有其余逻辑仍然一致且正确 - 至少,我认为现在已经修复。 :-)
  • 上次计算有误
猜你喜欢
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多