是否可以获得相同的SHA1哈希?

时间:2010-03-19 17:33:50

标签: cryptography hash sha1 checksum

给定两个不同的字符串S1和S2(S1!= S2)可能是:

SHA1(S1) == SHA1(S2)

是真的吗?

  1. 如果是 - 概率是多少?
  2. 如果没有 - 为什么不呢?
  3. 输入字符串的长度是否有上限,获取重复的概率为0? OR是SHA1的计算(因此重复的概率),与字符串的长度无关?
  4. 我想要实现的目标是散列一些敏感的ID字符串(可能与其他字段(如父ID)连接在一起),这样我就可以将哈希值用作ID(例如在数据库中)。

    示例:

    Resource ID: X123
    Parent ID: P123
    

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

    相反,我想创建一个新的列散列(“X123-P123”),让我们说它是AAAZZZ。然后客户端可以请求ID为AAAZZZ的资源,而不知道我的内部id等。

5 个答案:

答案 0 :(得分:115)

您所描述的内容称为 collision 。冲突必然存在,因为SHA-1接受更多不同的消息作为输入,它可以产生不同的输出(SHA-1可以吃任何比特串,最多2 ^ 64位,但输出只有160位;因此,至少一个输出值必须弹出几次)。无论函数是否为“良好”散列函数,此观察对输出小于其输入的任何函数都有效。

假设SHA-1的行为类似于“随机oracle”(一个基本上返回随机值的概念对象,唯一的限制是,一旦它在输入 m < m <上返回输出 v / em>,它必须始终在输入 m 上返回 v ,然后对于任何两个不同的字符串S1和S2,碰撞的概率应为2 ^( - 160)。仍然假设SHA-1表现得像一个随机的oracle,如果你收集了很多输入字符串,那么你应该在收集了大约2 ^ 80个这样的字符串之后开始观察碰撞。

(那是2 ^ 80而不是2 ^ 160因为,你可以用2 ^ 80个字符串制作大约2 ^ 159对字符串。这通常被称为“生日悖论”,因为它给大多数人带来了惊喜适用于生日时的碰撞。请参阅the Wikipedia page主题。)

现在我们强烈怀疑SHA-1 真的表现得像一个随机的oracle,因为生日悖论方法是随机oracle的最佳碰撞搜索算法。然而,已发布的攻击应该在大约2 ^ 63步中发现碰撞,因此比生日悖论算法快2 ^ 17 = 131072倍。在真正的随机预言中,这样的攻击不应该是可行的。请注意,此攻击尚未实际完成,它仍然是理论上的(有些人tried but apparently could not find enough CPU power)(更新:截至2017年初,有人 计算了{ {3}}使用上述方法,并且完全按预期工作)。然而,理论看起来很健康,而且看来SHA-1似乎不是一个随机的神谕。相应地,关于碰撞的概率,所有的赌注都是关闭的。

关于你的第三个问题:对于具有 n -bit输出的函数,如果你可以输入超过2 ^ n 个不同的消息,则必然会发生冲突,即,如果最大输入消息长度大于 n 。如果绑定 m 低于 n ,答案就不那么容易了。如果函数表现为随机oracle,那么碰撞存在的概率随着 m 降低,而不是线性,而是在 m = n / 2 。这与生日悖论的分析相同。对于SHA-1,这意味着如果 m&lt; 80 那么很可能没有碰撞,而 m&gt; 80 非常可能存在至少一次碰撞( m> 160 这变得确定)。

请注意,“存在碰撞”和“您发现碰撞”之间存在差异。即使碰撞必须存在,每次尝试时仍然有2 ^( - 160)的概率。前一段的意思是,如果你不能(在概念上)尝试2 ^ 160对字符串,例如,这样的概率是没有意义的。因为你将自己局限于少于80位的字符串。

答案 1 :(得分:32)

是的,因为pigeon hole principle

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

但是,加密哈希函数(如sha-family,md-family等)旨在最大限度地减少此类冲突。已知的最佳攻击需要2 ^ 63次尝试才能找到碰撞,所以机会是2 ^( - 63),实际上是0。

答案 2 :(得分:4)

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

例如,去年针对MD5的攻击已经针对SSL服务器证书签名,例如Security Now播客第179集。这使得复杂的攻击者能够为流氓网站生成虚假的SSL服务器证书。似乎是reaol的事情。因此,强烈建议避免购买MD5签名的证书。

答案 3 :(得分:4)

git使用SHA1哈希作为ID,并且2014年仍然没有已知的SHA1冲突。显然,SHA1算法很神奇。我认为这是一个很好的选择,因为你现在已经发现了它们的长度不存在冲突。但是,如果您不信任魔法并且不是博彩人,则可以生成随机字符串并将其与您的数据库中的ID相关联。但是如果您确实使用SHA1哈希并成为第一个发现冲突的哈希,那么您可以在此时将系统更改为使用随机字符串,将SHA1哈希保留为旧ID的“随机”字符串。

答案 4 :(得分:3)

你所说的是一种碰撞。这是一篇关于SHA1冲突的文章: http://www.rsa.com/rsalabs/node.asp?id=2927

编辑:所以另一个回答者打我提到鸽子洞原则大声笑,但澄清这就是为什么它被称为鸽子洞原则,因为如果你有一些洞切出载体鸽子嵌入,但你有更多鸽子比洞,然后一些鸽子(输入值)必须共用一个洞(输出值)。