【问题标题】:Is hashing really a irreversible process?散列真的是一个不可逆的过程吗?
【发布时间】:2018-04-11 13:43:18
【问题描述】:

我一直在使用哈希和 RSA(在非常肤浅的层面上,例如:SSH 连接上的 RSA 身份验证),我想了解更多。

首先,我知道加密是一个可以恢复的双向过程。并且散列是一个单向的过程,是不可逆的。

最后一点对我来说没有意义,如果我使用算法来散列“你好”,不会是相同的算法,而是“反转”(意思是,它“向后”工作),能够再次将该哈希转换为“hello”。

编辑:

感谢@GeorgDangl、@klutt 和Pete Kirkham 指出我根本不理解“不可逆数学”的概念。这些例子真的很有帮助。

【问题讨论】:

  • 这是因为您的输入空间(纯文本)大于输出空间(哈希)。这意味着对于每个不同的输出(散列),都有多个输入导致该散列。例如,根据存储的哈希验证密码的服务器可能会接受恰好具有相同哈希输出的不同密码(例如,用于彩虹表的攻击)
  • 也许 OP 可以花更多的研究精力,但我认为不需要 DV。这个问题对其他人来说非常清楚和有趣。我投了赞成票。
  • @DiegoS 我很清楚这是微不足道的。事实上,我已经检查过维基百科,但由于它不是查找信息的最佳地点,我检查了其他资源。由于我缺乏知识,我无法辨别真假(又名。过时的信息和/或错误的信息)。这就是我问这个问题的原因。
  • 即使输入空间小于输出空间,(加密)哈希也是不可逆的。产生这种情况所需要做的就是故意丢失一些信息,比如忽略整数加法溢出。注意事项:加密哈希是一类特殊的哈希,通常被设计为不可逆和抗冲突的。像字典一样用于快速查找的哈希可能非常简单,并且可能存在大量冲突,可以通过其他方法解决。
  • @zaph 你说的是真的,但我想指出的是,如果输入空间大于输出,那么它总是不可逆的。输入空间较大是不可逆性的充分条件,但不是必要条件。

标签: security encryption hash aes sha


【解决方案1】:

这是不可逆的,因为对于每个输入,您只有一个输出,但反过来则不然。有多个输入产生相同的输出。

对于任何给定的输入,有很多(实际上是无限的)不同的输入会产生相同的哈希值。这很容易实现,因为输出具有固定大小,而输入没有大小限制。

为了实现这一点,使用了不可逆的数学。例如,很容易计算10%3。答案很简单10%3=1。但是如果我给你公式x%3=1,你会怎么做?这个等式适用于所有x=3*k+1。因此,您无法获得我开头的号码。

不可逆数学的另一个例子是正弦和余弦。例如,cos(0)=1,但有更多的输入值计算为 1。实际上,cos(n*2pi)=1。这些函数存在“逆”,但它们要么给出一定范围内的答案,要么给出多值答案。第三个例子是x²=1x=1x=-1 都是如此。然而,在这个例子中,您得到的可能答案的数量是有限的(而且也是相当少的)。

在处理加密时,可以说私钥用于选择正确的解决方案。你总是可以很简单地解密一条加密的消息,但你会得到大量可能的答案。密钥用于找到正确的密钥,而不是实际解密。

另一件值得一提的事情是,一个好的散列算法可以最大限度地减少冲突,即两个输入生成相同的散列。此外,当涉及到密码学时,您希望它尽可能难以逆转。但这也带来了算法占用大量 CPU 的成本。

一个非常基本且不安全的哈希算法可能看起来像这样的伪代码:

hash = 0
for each byte in input:
    hash = hash + byte

这里我假设hash 是一个简单的整数变量,当它达到最大值时会回绕。该算法易于实现,而且速度很快。但是如果安全性很重要,您就不想使用它。修改文件通常很容易,这样哈希检查就不会检测到它。

真正的加密哈希算法力求实现这样的特性,即如果您更改输入中的任何单个位,输出中的每个单个位都有 50% 的机会翻转.此外,如果您在输入中翻转两位,则在输出中翻转的位将与如果您只是逐位更改将翻转的位完全无关。

我发现了一个关于这个主题的好 youtube 视频:https://www.youtube.com/watch?v=yoMOAIzBSpY

【讨论】:

  • 一个好的散列函数的另一个值得一提的属性是分散,你应该称之为它。假设您存储了散列的用户密码,如果多个数字返回相同的散列,则意味着您可以使用多个密码对同一用户进行身份验证。
  • @DiegoS 好点。我会考虑的。恐怕答案会变得有点宽泛。
  • @zaph 我认为 Diego 的意思是,每个输入始终具有相同的输出,但多个输入可以导致相同的输出。
  • @zaph 一点也不奇怪。这并不意味着没有碰撞。这只是简单的事实。称它为surjective函数。
  • @klutt:我不同意你的看法。计算机科学不是数学。也许在数学文档中,以你使用它的方式使用 unique 是完全可以的(也许你使用了这个词,因为你有数学背景?),但在 CS 中,它不是。我从未见过以这种方式使用独特的。请进行搜索,例如“密码学唯一”。我检查了前约 10 个结果,所有结果都是独一无二的,而不是你使用它的方式。例如,当他们谈论“唯一密钥”时,他们的意思是只有一个实体拥有这个密钥,而不是“只有一个密钥”。
【解决方案2】:

简单的例子 - 假设对于我们的不可逆函数,我们取输入的数字并返回模 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 是整数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2014-09-29
    • 2019-01-13
    • 2015-12-14
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多