为什么不能像反转数学函数那样反转算法?如何制作一个不可逆的算法?
如果使用彩虹表,使用盐巳经无法破解它,是什么原因呢?如果您在用暴力方式制作彩虹表,那么它会生成每个明文可能的值(到一定长度),这将包括每个可能密码和每个可能盐的盐值(盐和密码/文本只需作为一个单独的文本串出现)。
为什么不能像反转数学函数那样反转算法?如何制作一个不可逆的算法?
如果使用彩虹表,使用盐巳经无法破解它,是什么原因呢?如果您在用暴力方式制作彩虹表,那么它会生成每个明文可能的值(到一定长度),这将包括每个可能密码和每个可能盐的盐值(盐和密码/文本只需作为一个单独的文本串出现)。
MD5的设计目的是密码学上不可逆的。在这种情况下,最重要的属性是,在计算上找到哈希的反向是不可行的,但很容易找到任何数据的哈希值。例如,让我们考虑仅对数字进行操作(毕竟,二进制文件可以被解释为一个非常长的数字)。
假设我们有数字"7",我们想获取它的哈希值。也许我们尝试的第一件事是将其乘以二作为我们的哈希函数。正如我们将看到的,这不是一个非常好的哈希函数,但我们将尝试它,以说明一个观点。在这种情况下,数字的哈希值将是"14"。这很容易计算。但现在,如果我们看看它的反向有多难,我们发现它同样容易!给定任何哈希值,我们只需将其除以二即可获取原始数字!这不是一个好的哈希值,因为哈希的整个重点是计算反向比计算哈希更困难(这至少在某些环境中是最重要的属性)。
现在,让我们尝试另一个哈希函数。为此,我将介绍时钟算术的概念。在时钟上,数字并不是无限的。实际上,它只从0到11(请记住,在时钟上,0和12是相同的)。因此,如果你将11加1,则会得到0。你可以将乘法、加法和指数扩展到时钟上。例如,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进行哈希。攻击者最好的选择是暴力破解攻击,他们尝试一堆密码。就像你在前面的问题中可能会尝试小于12的数字一样,攻击者可能会尝试所有由少于7个字符的数字和字母组成的密码,或者所有出现在字典中的单词。重要的是,他不能尝试所有可能的密码,因为有太多可能的16个字符密码,例如永远无法测试。所以重点是攻击者必须限制他测试的可能密码,否则他甚至不会检查其中的一小部分。
现在,关于盐的想法是这样的:如果两个用户有相同的密码,那么它们将具有相同的哈希值。如果你仔细想一下,攻击者实际上并不必单独破解每个用户的密码。他只需遍历每个可能的输入密码,并将哈希与所有哈希进行比较。如果其中一个匹配,那么他就找到了一个新的密码。我们真正想要迫使他做的是为他想要检查的每个用户+密码组合计算一个新的哈希值。这就是盐的概念,即让哈希函数对每个用户略微不同,以便他无法为所有用户重用单个预计算值集。最直接的方法是在取哈希之前为每个用户的密码添加一些随机字符串,其中随机字符串对于每个用户都不同。例如,如果我的密码是“shittypassword”,我的哈希值可能显示为MD5(“6n93nshittypassword”),如果你的密码也是“shittypassword”,你的哈希值可能显示为MD5(“fa9elshittypassword”)。这个小位“fa9el”称为“盐”,对于每个用户都不同。例如,我的盐是“6n93n”。现在,这个附加到你的密码上的小位也被存储在你的计算机上。当你尝试使用密码X登录时,计算机只需计算MD5(“fa9el”+X)并查看它是否与存储的哈希匹配。从1到9999中选择2个数字进行相加,然后告诉我结果的最后一位数字。
根据这些信息,我无法推出你最初想到的数字。这是单向哈希的一个非常简单的例子。
但是,我可以想到两个数字产生相同的结果,这就是这个简单示例与像MD5或SHA1这样的“适当”的加密哈希不同的地方。对于这些算法,计算上制造出产生特定哈希的输入应该很困难。
我认为 md5 并没有提供完整的结果,因此您无法通过反向工作来查找原始 md5。
MD5是128位的,即3.4*10^38种组合。
八个字符长度密码的总数:
您需要为密码存储8个字节,为MD5值存储16个字节,每个条目总共需要24个字节。
因此,您需要大约67000G或5200000G的存储空间来存储彩虹表。 唯一能够破解密码的原因是人们使用明显的密码。