首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有可能得到完全相同的SHA1哈希?

有没有可能得到完全相同的SHA1哈希?
EN

Stack Overflow用户
提问于 2010-03-20 01:33:50
回答 5查看 55.4K关注 0票数 80

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

代码语言:javascript
复制
SHA1(S1) == SHA1(S2)

是真的吗?

  1. 如果是-概率是多少?
  2. 如果不是-为什么不?
  3. 输入字符串的长度是否有上限,其重复的概率为0?或者SHA1的计算(因此重复的概率)独立于字符串的长度?

我试图实现的目标是散列一些敏感的ID字符串(可能与其他一些字段结合在一起,比如parent ID),这样我就可以使用散列值作为ID (例如在数据库中)。

示例:

代码语言:javascript
复制
Resource ID: X123
Parent ID: P123

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

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-20 05:54:39

你所描述的被称为碰撞。冲突是必然存在的,因为SHA-1接受更多不同的消息作为输入,从而可以产生不同的输出(SHA-1可以吃掉最多2^64位的任何位字符串,但只输出160位;因此,至少必须有一个输出值出现多次)。这一观察结果对于任何输出小于输入的函数都是有效的,无论该函数是否是一个“好”的散列函数。

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

(这是2^80,而不是2^160,因为使用2^80个字符串可以生成大约2^159对字符串。这通常被称为“生日悖论”,因为当它应用于生日碰撞时,大多数人都会感到惊讶。有关此主题,请参阅the Wikipedia page。)

现在我们强烈怀疑SHA-1的行为并不真的像随机神谕,因为生日悖论方法是随机神谕的最佳碰撞搜索算法。然而,有一个公开的攻击,应该在大约2^63步内找到碰撞,因此2^17 = 131072倍于生日悖论算法。这样的攻击不应该在真正的随机先知上进行。请注意,这个攻击还没有真正完成,它仍然是理论上的(有些人tried but apparently could not find enough CPU power)(Update:在2017年初,有人确实用上面提到的方法计算了一个SHA-1 collision,它完全像预测的那样工作)。然而,这个理论看起来是合理的,而且SHA-1似乎真的不是一个随机的先知。相应地,至于碰撞的概率,那么,所有的赌注都是无效的。

至于你的第三个问题:对于一个有n位输出的函数,如果你可以输入超过2^n个不同的消息,那么必然会有冲突,即如果最大输入消息长度大于n,那么当界限m小于n时,答案就不那么容易了。如果函数表现为随机预言,则碰撞存在的概率随m下降,而不是线性下降,而是随着m=n/2的陡峭截止。这是与生日悖论相同的分析。对于SHA-1,这意味着如果m< 80,则没有碰撞的机会,而m> 80使得很可能存在至少一个碰撞(当m> 160时,这变得确定)。

请注意,“存在冲突”和“您发现冲突”是有区别的。即使必须存在碰撞,每次尝试时仍有2^(-160)的概率。上一段的意思是,如果你不能(从概念上)尝试2^160对字符串,那么这样的概率是相当没有意义的,例如,因为你限制自己只能使用少于80位的字符串。

票数 123
EN

Stack Overflow用户

发布于 2010-03-20 01:45:13

是的,这是可能的,因为有了pigeon hole principle

大多数散列(也包括sha1)具有固定的输出长度,而输入的大小是任意的。因此,如果你尝试足够长的时间,你可以找到他们。

然而,密码散列函数(如sha-系列、md-系列等)被设计为最小化这种冲突。已知的最好的攻击需要2^63次尝试才能找到冲突,所以机会是2^(-63),实际上是0。

票数 35
EN

Stack Overflow用户

发布于 2014-07-22 05:50:56

git使用SHA1哈希作为in,2014年仍未出现已知的SHA1冲突。显然,SHA1算法是神奇的。我认为这是一个很好的打赌,像你这样的长度的字符串不存在碰撞,因为它们现在已经被发现了。但是,如果你不相信魔法,也不是一个赌徒,你可以生成随机字符串,并将它们与你数据库中的in相关联。但是,如果您确实使用SHA1散列并成为第一个发现冲突的人,那么您只需在那时将系统更改为使用随机字符串,并将SHA1散列保留为遗留ID的“随机”字符串。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2479348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档