有可能获得相同的SHA1哈希?

给定两个不同的stringS1和S2(S1!= S2)有可能:

SHA1(S1) == SHA1(S2) 

是真的?

  1. 如果是 – 以什么概率?
  2. 如果不是 – 为什么不呢?
  3. inputstring的长度是否有上限,获得重复的概率是0? OR是SHA1的计算(因此重复的概率)独立于string的长度?

我试图实现的目标是哈希一些敏感的IDstring(可能与父ID一样的其他字段连接在一起),以便我可以使用哈希值作为一个ID(例如在数据库中)。

例:

 Resource ID: X123 Parent ID: P123 

我不想公开我的资源标识的性质,让客户端看到“X123-P123”。

相反,我想创build一个新的列哈希(“X123-P123”),假设它是AAAZZZ。 然后客户端可以请求具有AAAZZZ的资源,而不知道我的内部ID等。

你所描述的是所谓的碰撞 。 冲突必然存在,因为SHA-1接受更多不同的消息作为input,它可以产生不同的输出(SHA-1可以吃到高达2 ^ 64位的任何位串,但是只输出160位;因此至less有一个输出值必须popup几次)。 对于输出小于input的任何函数,无论函数是否为“好”散列函数,该观察结果都是有效的。

假设SHA-1的行为像一个“随机预言”(一个基本上返回随机值的概念对象,唯一的限制是一旦它在inputm上返回了输出v ,它必须总是在inputm上返回v ),那么对于任何两个不同的stringS1和S2,碰撞概率应该是2 ^( – 160)。 仍然假定SHA-1的行为像一个随机预言,如果你收集了很多inputstring,那么你应该在收集了大约2 ^ 80个这样的string之后开始观察碰撞。

(这是2 ^ 80而不是2 ^ 160,因为用2 ^ 80个string可以制作大约2 ^ 159对string,这通常被称为“生日悖论”,因为大多数人在应用碰撞在生日当天查看关于这个主题的维基百科页面 。)

现在我们强烈怀疑SHA-1实际上并不像一个随机预言,因为生日悖论的方法是随机预言的最佳碰撞searchalgorithm。 然而,已经发表的攻击应该在2 ^ 63步之内发现一个碰撞,因此比生日 – 悖论algorithm快2 ^ 17 = 131072倍。 这样的攻击不应该是一个真正的随机预言。 请注意,这个攻击实际上还没有完成,它仍然是理论上的(有人尝试过,但显然找不到足够的CPU能力 )( 更新:截至2017年初,有人用上述方法计算了SHA-1冲突 ,而且完全按照预期工作)。 然而,这个理论看起来很合理,看来SHA-1不是一个随机预言。 相应地,至于碰撞的概率,所有的投注都是closures的。

至于你的第三个问题:对于有n位输出的函数,如果你可以input2 ^以上不同的消息,也就是说,如果最大input消息长度大于n ,那么就有冲突。 如果m小于n ,答案就不那么简单了。 如果函数performance为一个随机预言,那么碰撞存在的概率就会随着m而降低,而不是线性的,而在m = n / 2附近有一个陡峭的截断。 这与生日悖论的分析是一样的。 对于SHA-1,这意味着如果m <80,那么机会是没有碰撞,而m> 80使得至less有一个碰撞的存在是非常可能的( m> 160,这是确定的)。

请注意,“存在碰撞”和“发现碰撞”是有区别的。 即使碰撞必须存在,每次尝试时仍然有2 ^( – 160)的概率。 前面的段落意味着,如果你不能(概念上)尝试2 ^ 160对string,那么这样的概率是没有意义的,例如,因为你限制自己的stringless于80位。

是的,这是可能的,因为鸽子洞的原则 。

大多数哈希(也是sha1)具有固定的输出长度,而input是任意大小。 所以如果你尝试足够长的时间,你可以find它们。

但是,密码散列函数(如sha-family,md-family等)被devise为最小化这种冲突。 已知最好的攻击需要2 ^ 63次尝试来find碰撞,所以在实践中机会是2 ^( – 63),这是0。

在哈希函数中几乎总是可能发生碰撞。 到目前为止,SHA1在生成不可预知的冲突方面非常安全。 危险是当可以预测冲突时,不需要知道原始的散列input来产生相同的散列输出。

例如,去年针对SSL服务器证书签名的MD5攻击就已经发生,例如安全现在播客第179集。这使得复杂的攻击者能够为stream氓网站生成一个伪造的SSL服务器证书,并且看起来像是一件好事。 出于这个原因,强烈build议避免购买MD5签名的证书。

git使用SHA1哈希值作为ID,2014年仍然没有已知的SHA1冲突。显然,SHA1algorithm是神奇的。 我认为这是一个很好的select,因为你现在已经发现了这些string,所以不存在碰撞。 但是,如果您不信任魔术而不是投注人,则可以生成随机string并将其与您的数据库中的ID相关联。 但是,如果您确实使用SHA1散列并成为第一个发现冲突,那么您可以将系统更改为当时使用随机string,并将SHA1散列保留为传统ID的“随机”string。

你在说什么叫做碰撞。 这是一篇关于SHA1碰撞的文章: http ://www.rsa.com/rsalabs/node.asp? id= 2927

编辑:另一位回答者殴打我提到鸽子孔原理大声笑,但澄清这就是为什么它被称为鸽子洞的原则,因为如果你有一些洞,鸽子窝embedded,但你有更多的鸽子比洞,那么一些鸽子(input值)必须共享一个洞(输出值)。