哈希真的是一个不可逆的过程吗?
Is hashing really a irreversible process?
我已经使用哈希和 RSA 一段时间了(在非常肤浅的层面上,例如:SSH 连接上的 RSA 身份验证),我想了解更多。
首先,我知道加密是一个可以恢复的双向过程。哈希是一种不可逆的单向过程。
最后一点对我来说没有意义,如果我使用一种算法来散列 "hello",不会是相同的算法,但是 "reversed"(意思是,它有效 "backwards"),能够再次将该散列转换为 "hello"。
编辑:
感谢@GeorgDangl、@klutt 和 Pete Kirkham 指出我根本不理解 "irreversible math" 的概念。这些例子真的很有帮助。
从某种意义上说,这是不可逆的,即对于每个输入,您只有一个输出,但反之则不然。有多个输入产生相同的输出。
对于任何给定的输入,有很多(实际上是无限的)不同的输入会产生相同的散列。这很容易实现,因为输出具有固定大小,但输入没有大小限制。
为了实现这一点,使用了不可逆的数学。例如,很容易计算出10%3
。答案很简单 10%3=1
。但是如果我给你方程x%3=1
,你会怎么做?这个等式对所有 x=3*k+1
都适用。因此,您无法获得我开始使用的号码。
不可逆数学的另一个例子是正弦和余弦。例如,cos(0)=1
,但计算结果为 1 的输入值更多。实际上,cos(n*2pi)=1
。这些函数有“反函数”,但它们要么给出一定范围内的答案,要么给出多值答案。第三个例子是x²=1
。 x=1
和 x=-1
都是如此。但是,在此示例中,您得到的可能答案的数量是有限的(而且相当少)。
在处理加密时,可以说私钥是用来选择正确的解决方案的。你总是可以非常简单地解密加密的消息,但你会得到大量可能的答案。密钥用于找到正确的密钥,而不是实际解密。
另一件值得一提的事情是,一个好的散列算法可以最大限度地减少冲突,即两个输入生成相同的散列。此外,当涉及到密码学时,您希望它尽可能难以逆转。但这也伴随着算法 cpu 密集的成本。
一个非常基本且不安全的哈希算法可能类似于以下伪代码:
hash = 0
for each byte in input:
hash = hash + byte
这里我假设 hash
是一个简单的整数变量,当它达到最大值时会回绕。该算法易于实现,而且速度很快。但如果安全性很重要,您就不想使用它。修改文件通常很容易,这样哈希检查就不会检测到它。
真正的加密哈希算法努力实现 属性 如果您更改输入中的 any 单个位,every输出中的单个位有 50% 的翻转机会。此外,如果您翻转输入中的两位,则输出中翻转的位将与您只是逐一更改位时将翻转的位完全无关。
我在 YouTube 上找到了一个很好的主题视频:https://www.youtube.com/watch?v=yoMOAIzBSpY
简单的例子 - 假设对于我们的不可逆函数,我们采用输入的数字和 return 模 7 的值。
hash( 0) => 0
hash( 1) => 1
hash( 2) => 2
hash( 3) => 3
hash( 4) => 4
hash( 5) => 5
hash( 6) => 6
hash( 7) => 0
hash( 8) => 1
hash( 9) => 2
hash(10) => 3
hash(12) => 4
hash(13) => 5
hash(14) => 6
因此,如果哈希值为 6,您不知道输入是 6 还是 14,或者 6 + 7 * N 的任何值,其中 N 是整数。
我已经使用哈希和 RSA 一段时间了(在非常肤浅的层面上,例如:SSH 连接上的 RSA 身份验证),我想了解更多。
首先,我知道加密是一个可以恢复的双向过程。哈希是一种不可逆的单向过程。
最后一点对我来说没有意义,如果我使用一种算法来散列 "hello",不会是相同的算法,但是 "reversed"(意思是,它有效 "backwards"),能够再次将该散列转换为 "hello"。
编辑:
感谢@GeorgDangl、@klutt 和 Pete Kirkham 指出我根本不理解 "irreversible math" 的概念。这些例子真的很有帮助。
从某种意义上说,这是不可逆的,即对于每个输入,您只有一个输出,但反之则不然。有多个输入产生相同的输出。
对于任何给定的输入,有很多(实际上是无限的)不同的输入会产生相同的散列。这很容易实现,因为输出具有固定大小,但输入没有大小限制。
为了实现这一点,使用了不可逆的数学。例如,很容易计算出10%3
。答案很简单 10%3=1
。但是如果我给你方程x%3=1
,你会怎么做?这个等式对所有 x=3*k+1
都适用。因此,您无法获得我开始使用的号码。
不可逆数学的另一个例子是正弦和余弦。例如,cos(0)=1
,但计算结果为 1 的输入值更多。实际上,cos(n*2pi)=1
。这些函数有“反函数”,但它们要么给出一定范围内的答案,要么给出多值答案。第三个例子是x²=1
。 x=1
和 x=-1
都是如此。但是,在此示例中,您得到的可能答案的数量是有限的(而且相当少)。
在处理加密时,可以说私钥是用来选择正确的解决方案的。你总是可以非常简单地解密加密的消息,但你会得到大量可能的答案。密钥用于找到正确的密钥,而不是实际解密。
另一件值得一提的事情是,一个好的散列算法可以最大限度地减少冲突,即两个输入生成相同的散列。此外,当涉及到密码学时,您希望它尽可能难以逆转。但这也伴随着算法 cpu 密集的成本。
一个非常基本且不安全的哈希算法可能类似于以下伪代码:
hash = 0
for each byte in input:
hash = hash + byte
这里我假设 hash
是一个简单的整数变量,当它达到最大值时会回绕。该算法易于实现,而且速度很快。但如果安全性很重要,您就不想使用它。修改文件通常很容易,这样哈希检查就不会检测到它。
真正的加密哈希算法努力实现 属性 如果您更改输入中的 any 单个位,every输出中的单个位有 50% 的翻转机会。此外,如果您翻转输入中的两位,则输出中翻转的位将与您只是逐一更改位时将翻转的位完全无关。
我在 YouTube 上找到了一个很好的主题视频:https://www.youtube.com/watch?v=yoMOAIzBSpY
简单的例子 - 假设对于我们的不可逆函数,我们采用输入的数字和 return 模 7 的值。
hash( 0) => 0
hash( 1) => 1
hash( 2) => 2
hash( 3) => 3
hash( 4) => 4
hash( 5) => 5
hash( 6) => 6
hash( 7) => 0
hash( 8) => 1
hash( 9) => 2
hash(10) => 3
hash(12) => 4
hash(13) => 5
hash(14) => 6
因此,如果哈希值为 6,您不知道输入是 6 还是 14,或者 6 + 7 * N 的任何值,其中 N 是整数。