是什么阻止我反转哈希函数?

What prevents me from reversing a hash function?

实际上是什么阻止我反转哈希函数并从具有相同哈希的哈希生成可能的输入?

我知道哈希函数是单向函数,这意味着我无法通过它的哈希恢复真实输入。

我在谷歌上搜索了很多,发现很多人都在解释这个简单的哈希函数示例:

hash(x) = x % 7

我无法从这里的散列中恢复输入 (x),但如果我知道散列,我可以从中生成一个 可能的输入哈希:

unhash(h) = some_random_integer * 7 + h

some_random_integer 的值根本不重要。 unhash(3) 例如: 24 , hash(24) 是: 3 !

我发现的另一个例子是:

hash(x, y) = x * y

所以就像前面的例子一样,我无法从散列中找到真正的输入(x 和 y),但我可以找到一个可能的输入,它具有相同的散列:

x = hash / some_random_integer
y = hash / x

例如,当恶意黑客获得了对充满散列密码的数据库的访问权限时,他只能通过生成 可能的输入 来登录被黑用户将生成与他的密码相同的哈希值!不必是准确的原始密码。

我知道真正的散列函数比这个例子复杂得多,但我想不出有什么数学运算不能这样逆向。 (或者也许有一些?)

究竟是什么阻止我以这种方式反转真正的哈希函数? (如 MD5、SHA1 等...)

通过散列函数,假设您指的是加密散列函数,例如 SHA 系列。

密码哈希函数的设计让你无法逆向它,这是设计的基本标准。

还有其他类型的哈希函数,例如字典哈希函数,它们可能非常简单,但即使是这些函数,通常也会丢失部分输入。 hash(x) = x % 7 就是这样一个简单的哈希函数的例子。

在密码散列的情况下,必须考虑暴力破解,即从常用密码列表中尝试密码和模糊测试。通常的解决方案是使用消耗大量 CPU 时间的散列函数,通常通过迭代约 100ms 的散列函数,PBKFD2 就是这样的函数,并且被 NIST 推荐用于密码散列。

此外,输入可能大于输出=,并且有意丢失了一些信息。