Hash 为什么不可能反转加密哈希?

Hash 为什么不可能反转加密哈希?,hash,cryptography,md5,cryptographic-hash-function,reversing,Hash,Cryptography,Md5,Cryptographic Hash Function,Reversing,为什么不能像反转数学函数一样反转算法呢?怎么可能做出一个不可逆的算法 如果你用的是彩虹桌,是什么让你无法用盐来打破它呢?如果你正在用蛮力制作一个彩虹表来生成它,那么它会创造出每一个可能的纯文本值(长度),最终会包括每个可能的密码和每个可能的密码的salt(salt和密码/文本将作为一个单独的文本片段组合在一起).我不认为md5给出了全部结果-因此,您无法反向查找md5版的原始内容想想从1到9999的2个数字。添加它们。现在告诉我最后的数字 我无法从这些信息推断出你最初想到的数字。这是一个非常简单

为什么不能像反转数学函数一样反转算法呢?怎么可能做出一个不可逆的算法


如果你用的是彩虹桌,是什么让你无法用盐来打破它呢?如果你正在用蛮力制作一个彩虹表来生成它,那么它会创造出每一个可能的纯文本值(长度),最终会包括每个可能的密码和每个可能的密码的salt(salt和密码/文本将作为一个单独的文本片段组合在一起).

我不认为md5给出了全部结果-因此,您无法反向查找md5版的原始内容

想想从1到9999的2个数字。添加它们。现在告诉我最后的数字

我无法从这些信息推断出你最初想到的数字。这是一个非常简单的单向散列示例


现在,我可以想到两个给出相同结果的数字,这就是这个简单示例不同于像MD5或SHA1这样的“正确”加密哈希的地方。使用这些算法,计算出一个产生特定哈希的输入应该很困难。

不能反转哈希函数的一个主要原因是数据丢失

考虑一个简单的示例函数:“OR”。如果将其应用于1和0的输入数据,则得到1。但是现在,如果你知道答案是“1”,你如何撤销原始数据?你不能。它可能是1,1,或者可能是0,1,或者可能是1,0

至于盐桌和彩虹桌。是的,理论上,你可以有一个彩虹表,包含所有可能的盐和密码,但实际上,这太大了。如果您尝试了小写字母、大写字母、数字和12个标点符号(最多50个字符)的所有可能组合,则(26+26+10+12)^50=2.9 x 10^93的可能性不同。这比可见宇宙中的原子数量还要多


rainbow表背后的思想是提前计算一组可能的密码的哈希值,而密码比50个字符短得多,因此可以这样做。这就是为什么要在前面添加一个salt:如果在密码前面添加“57sjflk43380h4ljs9flj4ay”。虽然有人可能已经计算了“pa55w0rd”的哈希,但没有人已经计算了“57sjflk43380h4ljs9flj4aypa55w0rd”的has。

md5是128位,即3.4*10^38组合

八个字符长度的密码总数:

  • 仅小写字符和数字:36^8=2.8*10^12
  • 大小写和数字:62^8=2.18*10^14
您必须为密码存储8个字节,为md5值存储16个字节,即每个条目总共存储24个字节

因此,您需要大约67000G或5200000G的存储空间来存放彩虹桌。 真正有可能找出密码的唯一原因是人们使用明显的密码。

MD5就是这样设计的。在这种情况下,最重要的特性是,在计算上不可能找到哈希的反向,但很容易找到任何数据的哈希。例如,让我们考虑一下仅仅对数字进行操作(毕竟二进制文件可能被解释为一个很长的数字)

假设我们有数字“7”,我们想取它的散列。也许我们作为散列函数尝试的第一件事是“乘以2”。正如我们将看到的,这不是一个很好的哈希函数,但我们将尝试它,以说明一点。在这种情况下,数字的散列将是“14”。这很容易计算。但是现在,如果我们看看扭转它有多困难,我们发现它也同样容易!给定任何散列,我们只需将其除以2即可得到原始数字!这不是一个好的散列,因为散列的全部要点是计算逆比计算散列要困难得多(至少在某些上下文中,这是最重要的属性)

现在,让我们试试另一个杂凑。对于这一个,我将要介绍时钟算法的思想。在时钟上,数字不是无限的。事实上,它只是从0到11(记住,0和12在一个时钟上是相同的)。所以如果你把11加一,你就得到零。您可以将乘法、加法和幂运算的思想扩展到时钟。例如,8+7=15,但时钟上的15实际上只是3!所以在时钟上,你会说8+7=3!6*6=36,但在时钟上,36=0!所以6*6=0!现在,对于权力的概念,你可以做同样的事情。2^4=16,但16只是4。所以2^4=4!现在,这里是它与哈希的关系。我们试试散列函数f(x)=5^x,但使用时钟算法。正如您将看到的,这将导致一些有趣的结果。让我们像以前一样尝试使用7的散列

我们看到5^7=78125,但在一个时钟上,这只是5(如果你计算一下,你会发现我们已经绕着时钟转了6510次)。我们得到f(7)=5。现在的问题是,如果我告诉你我的数字是5,你能计算出我的数字是7吗?实际上,在一般情况下,很难计算这个函数的倒数。比我聪明得多的人已经证明,在某些情况下,逆转这个函数比向前计算要困难得多(编辑:尼莫指出,这一点事实上还没有得到“证实”;事实上,你能得到的唯一保证是,许多聪明人已经尝试了很长时间来找到一种简单的方法,但没有一个成功。)逆转这一操作的问题被称为“”。查找它以获得更深入的报道。这至少是一个好的散列函数的开始

对于现实世界中的散列函数,其思想基本上是相同的:您可以找到一些难以反转的函数。比我聪明得多的人设计了MD5和其他散列,使它们难以逆转