-1

我有一个关于散列的基本问题。据说散列是一种方法。我有一个疑问,如果我们只是简单地反转程序/算法/逻辑中的步骤,那么我们不能找到至少一个哈希到给定输出哈希值的输入吗?

我找到了2个相关的帖子,但我仍然不完全清楚:

一种方法如何散列?

单向哈希函数如何工作?(已编辑)

我对第一篇文章中接受的答案的评论有同样的问题:

“好吧,但是如果我想绕过密码检查,只需找到一个哈希值与原始密码相同的字符串就足够了”。这个评论站得住脚吗?

4

3 回答 3

3

您正在考虑的称为“哈希冲突”。

而且你的想法是对的,如果有人能找到一种有效的方法来确定给定哈希函数的输入,从而产生所需的输出,这将破坏很多系统(https://en.wikipedia.org/wiki/原像攻击

这就是加密安全散列函数的骨干。这些都是以某种方式构建的,即很难找到产生所需散列的原像。

随着时间的推移,数学家和密码学家正在逐渐消除这些散列,并且许多用于保护事物的散列函数已被破坏(MD4、MD5、SHA-1)。

此外,区分用于检查消息完整性的哈希值和用于保护机密的哈希值也很重要。

对于完整性检查,您需要快速散列,以便您可以以最小的努力通过它们放置大量数据。MD5、SHA-1、SHA-2 就是这样的哈希值。

对于保密,您需要比糖蜜哈希更,这样人们就不能轻易地通过其他可预测的秘密模式的字典来暴力破解。SCrypt、BCrypt、Argon 和多轮 PBKDF 方案就是这样的哈希。

于 2021-03-20T16:41:31.327 回答
1

加密散列函数中的操作非常复杂,而且数量如此之多,以至于反转该函数(为给定输出计算至少一个有效输入)是非常不可行的。无论您是手动进行还是借助某种算法求解器来进行反转都没有关系。这被称为(第一)原像抗性,这是密码学家在提出新的哈希函数时所攻击的内容。如果哈希函数经受住了时间的考验,则被认为是安全的。

另一方面,生成一堆候选密码并在它们上运行已知的哈希函数以检查与给定输出的相等性要容易得多。人类不擅长生成好的密码或密码短语。看看这个谈话

在散列中,我们不能找到至少一个原始文本散列到给定的散列值吗

在这种情况下,“寻找”如暴力破解输入空间比攻击哈希函数本身更容易。

于 2021-03-20T19:55:23.770 回答
0

有一种非常简单的方法可以提供不可逆的哈希函数:

int GetHashCode(byte[] myData)
{
    return 1;
}

这是一个完全有效的散列函数,因为它将任意数据集的内容映射到一个小得多的域(int在本例中)。它满足相同的输入数据给出相同的输出数据的条件。

很明显,这个函数是不可逆的。

(当然,这个散列函数并不适合保护任何东西,但这只是散列函数的一种应用)

于 2021-03-20T17:14:07.227 回答