从数学/理论上讲,2 个不同的输入具有 2 个不同哈希函数的相同结果的可能性有多大?

信息安全 密码学 哈希
2021-08-15 17:17:10

从数学/理论上讲,2 个不同的输入具有 2 个不同哈希函数的相同结果的可能性有多大?

例如,我将使用 2 个较弱的哈希算法,MD5 (碰撞漏洞)和 SHA-1碰撞漏洞所以我有密码我用 MD5 散列它,然后用 SHA-1 散列它。从数学/理论上讲,我的结果中存在具有相同 SHA 散列和 MD5 散列的另一个输入的可能性有多大?

4个回答

数学上?100% 的概率。几乎可以肯定存在其他一些具有相同 MD5 和 SHA 哈希值的输入。

几乎?0% 的概率。虽然存在其他一些输入,但在宇宙的生命周期内没有已知的方法可以找到它。

你问的是第二个预像电阻。据我所知,至少 SHA1(可能还有 MD5)被认为可以提供强大的原像抗性。因此评论说,在已知宇宙的生命周期内,没有已知的方法可以找到具有相同哈希值的另一个输入。

碰撞攻击专门针对您可以根据需要选择两个碰撞输入的情况。对于你描述的密码场景,密码通常是事先确定好的,所以不是碰撞,而是原像攻击。由于对手可能也不知道密码,因此您担心的是“第一原像”攻击。这是最难的攻击,因为它给对手的自由度最低。SHA1 和 MD5 目前对这种攻击是安全的。这意味着对于所有实际目的,找到给定哈希和输出的另一个输入的可能性为零。

换句话说:如果这种攻击能够奏效,那么当前的大多数网络协议都是不安全的。(人们实际上检查了当前的协议,看看碰撞攻击是否危险,并决定我们可以继续使用它们。)

如果我有两个不同的随机字符串 (s1, s2) ( s1 != s2),您想知道 的概率md5(s1) == md5(s2) AND sha1(s1) == sha1(s2)

好吧,首先对于两个特定的随机选择的字符串,概率是md5(s1) == md5(s2)多少?回答它的 1/2^128,因为第一个散列是一些 128 位字符串,第二个散列等于第二个散列的机会是 2^128 中的 1 或大约 2.9 x 10^-37 %。

同样,P(sha1(s1) == sha1(s2)) = 2^-160 ~ 6.8 x 10^-47 %

现在,假设它们是独立条件(即散列函数从根本上相互独立),则两个条件都为真的概率是通过将自P(X AND Y) = P(X) P(Y)so的概率相乘来找到的P(md5(s1)==md5(s2) AND sha1(s1) == sha1(s2)) = 2^-288 ~ 2 x 10^-85 %

当然,我们假设散列函数在字符串上彼此独立——这是对 md5 和 sha1 作为散列函数的公平假设。但是,如果我们不比较 MD5 和 SHA-1,而是比较 MD5 和一个新的散列函数,它只是 MD5 应用于自身 100 次,我们会发现只要 md5(s1) == md5(s2),我们也会有md5^100(s1) == md5^100(s2),因此两者碰撞的概率与发生一次碰撞的概率相同。

同样,如果我们有一个愚蠢的“哈希”函数,它只是 silly_hash(s) = md5(s) ++ s(其中 ++ 表示连接),那么你可以证明如果 s1 != s2 和 md5(s1) = = md5(s2) then silly_hash(s1) != silly_hash(s2) -- 这意味着你永远不会与 md5 和 silly_hash 发生双重冲突。

如果您有一个返回与 $str2 相同的 md5 的 $str1,那么它们将自动具有相同的 sha1。那是因为如果您正在执行 SHA1(MD5($string)),那么您只需将 SHA1 部分的输入数量从无限空间减少到 128 位。