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

In Hashing, can't we find AT LEAST one original text hashing to the given hash value

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

我找到了2个相关的post,但我还是不太清楚:

How is one way hashing possible?

How do one-way hash functions work? (Edited)

我和第一个已接受答案的评论有同样的问题post:

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

你想到的是所谓的“哈希冲突”。

你的想法是对的,如果可以找到一种有效的方法来确定给定哈希函数的输入并产生所需的输出,这将破坏很多系统 (https://en.wikipedia.org/wiki/Preimage_attack)

这就是加密安全散列函数的核心所在。它们的构建方式非常非常难找到产生所需散列的原像。

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

区分用于检查消息完整性的散列和用于保护机密的散列也很重要。

对于完整性检查,您需要 fast 哈希,这样您就可以通过它们轻松地处理大量数据。 MD5、SHA-1、SHA-2 就是这样的哈希。

为了保密,你需要 SLOW - 比糖蜜哈希还要慢,这样一个人就不能轻易地通过其他人的字典进行暴力破解秘密的可预测模式。 SCrypt、BCrypt、Argon 和多轮 PBKDF 方案就是这样的哈希。

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

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

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

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

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

加密散列函数中的操作非常复杂,并且有太多的操作,以至于逆向函数(为给定输出计算至少一个有效输入)是难以置信的不可行。无论您是手动还是在某种算法求解器的帮助下进行逆向都没有关系。这被称为(第一)原像抵抗,这就是密码学家在提出新的哈希函数时正在攻击的东西。如果哈希函数经受住了时间的考验,它就被认为是安全的。

另一方面,只生成一堆候选密码和 运行 已知的哈希函数来检查与给定输出是否相等要容易得多。人类非常不擅长生成好的密码或密码短语。看看这个 talk.

In Hashing, can't we find AT LEAST one original text hashing to the given hash value

在这种情况下,“发现”如暴力强制输入 space 比攻击哈希函数本身更容易。