实际上是什么阻止我反转哈希函数并从具有相同哈希的哈希生成可能的输入?
我知道哈希函数是单向函数,这意味着我无法通过它的哈希恢复真实输入。
我搜索了很多,我发现很多人都在解释这个简单的哈希函数示例:
hash(x) = x % 7
我无法从散列中恢复输入(x),但如果我知道散列,我可以从中生成可能的输入,它将具有相同的散列:< / p>
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等......)
答案 0 :(得分:0)
通过散列函数,假设您指的是加密散列函数,例如SHA族。
加密哈希函数的设计使您无法逆转它,这是设计中的基本标准。
还有其他类型的散列函数,例如字典散列函数可能非常简单,但即便如此,但通常会丢失部分输入。 hash(x) = x % 7
是这种简单哈希函数的一个例子。
在密码哈希的情况下,必须考虑强制执行,即从常用密码和模糊测试列表中尝试密码。通常的解决方案是使用占用大量CPU时间的散列函数,通过迭代散列函数大约100ms,PBKFD2就是这样一个函数,NIST建议使用密码散列。
此外,输入可能大于输出=并且有些信息会故意丢失。