Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cryptography 有可能得到相同的SHA1散列吗?_Cryptography_Hash_Sha1_Checksum - Fatal编程技术网

Cryptography 有可能得到相同的SHA1散列吗?

Cryptography 有可能得到相同的SHA1散列吗?,cryptography,hash,sha1,checksum,Cryptography,Hash,Sha1,Checksum,给定两个不同的字符串S1和S2(S1!=S2),是否可能: SHA1(S1) == SHA1(S2) 这是真的吗 如果是,概率是多少 如果没有-为什么没有 输入字符串的长度是否有一个上限,对于该上限,获得重复的概率为0?或者SHA1的计算(因此重复的概率)与字符串的长度无关 我试图实现的目标是散列一些敏感的ID字符串(可能与一些其他字段(如父ID)连接在一起),以便我可以使用散列值作为ID(例如在数据库中) 例如: Resource ID: X123 Parent ID: P123 我不想公

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

SHA1(S1) == SHA1(S2)
这是真的吗

  • 如果是,概率是多少
  • 如果没有-为什么没有
  • 输入字符串的长度是否有一个上限,对于该上限,获得重复的概率为0?或者SHA1的计算(因此重复的概率)与字符串的长度无关
  • 我试图实现的目标是散列一些敏感的ID字符串(可能与一些其他字段(如父ID)连接在一起),以便我可以使用散列值作为ID(例如在数据库中)

    例如:

    Resource ID: X123
    Parent ID: P123
    
    我不想公开我的资源标识的性质以允许客户端看到“X123-P123”


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

    您所说的是冲突。下面是一篇关于SHA1碰撞的文章:


    编辑:所以另一个回答者击败了我提到鸽子洞原理LOL,但为了澄清这就是为什么它被称为鸽子洞原理,因为如果你有一些为信鸽筑巢的洞,但是你有比洞更多的鸽子,那么一些鸽子(输入值)必须共享一个洞(输出值).

    是的,这是可能的,因为

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


    然而,加密散列函数(如sha系列、md系列等)的设计目的是最小化此类冲突。已知的最佳攻击需要2^63次尝试才能找到碰撞,因此概率为2^(-63),实际上为0

    您所描述的称为碰撞。冲突必然存在,因为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对字符串。这通常被称为“生日悖论”,因为当应用于生日碰撞时,大多数人都会感到惊讶。请参见主题中的。)

    现在我们强烈怀疑SHA-1的行为并不像随机预言机,因为生日悖论方法是随机预言机的最佳碰撞搜索算法。然而,有一个公开的攻击应该在大约2^63步中发现碰撞,因此比生日悖论算法快2^17=131072倍。这种攻击不应该在真正的随机预言机上进行。请注意,此攻击尚未实际完成,它仍然是理论性的(有些人)(更新:截至2017年初,有人确实使用上述方法计算了a,并且它完全按照预期工作)。然而,这一理论看起来很合理,似乎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位的字符串。

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


    例如,去年针对SSL服务器证书签名发起了针对MD5的攻击,例如在播客第179集中。这使得老练的攻击者能够为流氓网站生成一个伪造的SSL服务器证书,这似乎是真的。因此,强烈建议避免购买MD5签名证书。

    git
    使用SHA1哈希作为ID,2014年仍然没有已知的SHA1冲突。显然,SHA1算法很神奇。我认为这是一个很好的赌注,对于你的长度的字符串,碰撞不存在,因为它们现在已经被发现了。但是,如果您不信任魔法,并且不是一个赌徒,那么您可以生成随机字符串,并将它们与数据库中的ID关联。但我