我正在读一个关于MD5的问题,这让我记住了令我难以置信的事情。非常简单的问题,如果它不是一个好的我很抱歉。我只是无法理解你是如何使用某种算法将某些东西转换为一种东西的,并且无法使用反向算法将其转换回来。
那怎么可能呢?
此外,由于多个字符串可以创建相同的MD5哈希值,因为它的数据少于输入字符串,所以其他任何哈希系统如何更好?
答案 0 :(得分:102)
基本上是因为MD5的输出包含的信息少于输入。这基本上是将哈希算法与加密算法区分开来的。
这是一个简单的例子:想象一个算法来计算10位数字的哈希值。该算法是“返回最后2位数”。如果我采用8023798734的哈希值,我得到34,但是如果你只有34,你将无法分辨原始数字是什么,因为哈希算法丢弃了8位数的信息。它与MD5类似,不同之处在于散列是通过复杂的过程计算的,而不是仅仅切断部分数据。
那么一个哈希怎么能比另一个好呢?首先,不同的哈希算法可以或多或少地抵抗冲突(当两个输入产生相同的输出时)。碰撞的概率与可能的散列输出的数量成反比。碰撞是散列的一个不合需要的特性,因为如果你的数据发生了变化,你也希望散列也改变,所以获得更好的散列算法的一种方法是使用具有更多可能输出的散列。在上面的数字示例中,取最后4位而不是最后2位数将与给定散列(技术上称为 preimage )发生冲突的概率降低到10000(而不是100)中的1,所以你所拥有的所有10位数字都有可能具有不同的哈希值。
还存在加密安全性问题。当您想使用散列来确保某些数据未被篡改时,任何进行篡改的人都无法预测哪些输入会产生给定的输出。如果可以,他们将能够以输出(散列)保持不变的方式改变输入数据。再回到数字示例,假设我打算通过电子邮件向您发送电话号码1879483129,并且非常重要这个号码可以保持不变。我可能会打电话给你并告诉你数字的哈希值,这将是29,但由于“最后2位数”算法不是加密安全的,一个邪恶的黑客可以改变途中的号码,比如5555555529你不会不知道区别。
已经显示MD5 is not cryptographically secure(和SHA-1 is also compromised)。这意味着可以找到与任何给定输出相对应的不同输入。它仍然是防止随机位翻转等的一个很好的算法,但是如果有人可能想要故意破坏你的数据,你应该使用更安全的东西,比如SHA-256或更高版本,可能是as part of an HMAC scheme
答案 1 :(得分:83)
我只是无法理解你是如何使用某种算法将某些东西转换为一种东西的,并且无法使用反向算法将其转换回来。
你可以把牛变成汉堡包,但你不能把汉堡变成牛。
转换会通过销毁来减少存在的数据,并且无法恢复数据。
答案 2 :(得分:16)
这是一个平行的:
加上您家中每个人的年龄。只保留最后两位数字。
现在根据这个数字告诉我每个人的年龄。
答案 3 :(得分:3)
想一想:
我有一个数字字符串,说它是“12345678”。
我有一个哈希算法,它只返回所有单个数字的总和,我们称之为f()
所以,f(“12345678”)= 1 + 2 + .. + 8 = 36。
然后问题:
我们不能,因为f()是一种算法导致信息丢失。
MD5是一个像f()这样的哈希算法,但要复杂得多。
答案 4 :(得分:2)
这是一个简单的答案......
存在有限数量的哈希值,以及无限多个可清除的明文值。
因此,反转给定的MD5哈希将导致无限数量的可能明文值。
答案 5 :(得分:2)
回答你问题的第二部分(第一部分的答案已被上面的其他人充分给出):MD5被认为是弱的,因为攻击密码的证据(即,可以做出的改变)在纯文本中不会导致MD5总和的变化)。其它散列技术可能不会像容易受到实质上是任意的散列碰撞(至少这种任意的碰撞还没有,尚未,被证明是可能与SHA-2散列集,等等),因此,攻击者是在非MD5技术中不太可能复制哈希散列(理论上,当然,散列冲突攻击可能对任何散列函数;如果不是这样,它就不会成为散列函数;问题是攻击者能够轻易地“伪造”一个“正确”的明文,即散列到相同散列值的明文。
顺便提及,明文的MD5总和不一定是安全的,因为它包含了“少”的数据或是“有损”,但是因为,从任意的明文,它计算一个固定范围内的总和值(对于明文&LT实际上,128位,MD5和,包含的信息比明文...更多,因此明文的数量(理论上无限)都可以对齐相同的MD5哈希值。
答案 6 :(得分:2)
MD5的主要用途和类似的加密哈希码是加密密码。在这种情况下,我不关心是否可以重建原始字符串。我只关心是否可以构造任何会散列到相同值的字符串。
举一个简单的例子:假设我们的哈希算法是“取最后两位数字”。因此,如果我的密码是“12345678”,则哈希码为“78”。有没有办法从“78”回到“12345678”?不。但是,如果我是黑客密码,我不在乎我是否知道您的原始密码是什么。我只想要一个密码让我进去。所以如果我知道这是算法,我会说很好,我会使用密码“99978”。它哈希到“78”,因此密码验证算法将通过它,我就在。
显然MD5更难以逆转,即使在“任何能够散列到正确值的任何东西”的意义上,然后是一个简单的算法,比如“取最后两位数字”。但它真的不可能吗?这也让我很困惑。当然,信息在此过程中被丢弃。但是,在丢弃信息的任何地方,通过填写任何随机值,我不能反转为“任何”值吗?我还没有看过MD5的实际算法。我认为这不是一件容易倒退的事情,比如将所有的优点改为minues或像这样的微不足道的东西,或者很久以前有人会这样做。事实上,有数百万黑客试图破解这一点,即使理论上可行,也一定非常困难。
答案 7 :(得分:1)
此外,由于多个字符串可以 由于它,创建相同的MD5哈希 数据少于输入字符串, 怎么会有其他的哈希系统 还好吗?
虽然确实存在多个(甚至无限多个)具有相同散列的消息,但加密散列的目标是使找到此类冲突变得不可行。
您可能会认为通过计算随机消息的哈希值可能会发现冲突,直到您最终获得两次相同的结果。但是,您低估了可能的哈希值的空间大小。
对于MD5,散列的大小为128位。道格拉斯·亚当斯(Douglas Adams)的话说,128位的空间很大。真的很大。你只是不会相信这是多么大的惊人的大。可能的哈希数是2 128 ,或3.40282367×10 38 。这是一个34然后是37个零!如果你可以在一秒钟内计算到万亿,那么通过所有128位数字仍需要100亿美元。
然而,像MD5这样的一些哈希算法存在弱点,允许攻击者将其反转(即找到具有给定哈希的消息),与仅仅强力尝试相比,其工作量要少得多。在这方面,MD5被认为是完全破裂的。
答案 8 :(得分:1)
考虑以下函数:f(x)= x x。现在,假设你知道f(x)= 25,x是什么?嗯,答案可能是5或答案可能是-5。您无法将输入恢复为f,因为在f的范围内存在一些值,使得f的域的多个元素映射到f下的该值。因此,函数f是不可逆的。同样的概念适用于MD5; MD5算法有多个输入,尽管输入不同,但会产生相同的散列值。换句话说,MD5算法,如f(x)= x x,不是一对一的,因此不是可逆函数。
但是,这并不意味着您无法恢复MD5的输入。它只是意味着您无法100%确定地恢复输入和MD5。为了使这更具体,让我们再看一下函数f(x)= x * x。现在,如果我告诉你,对于f的任何给定输入,它为正的概率是99%?在这种情况下,您可以非常好地猜测25的散列来自值5而不是-5。实际上,这是人们如何能够破坏哈希函数(包括MD5,事实证明,这不是一个非常好的加密哈希函数)。在密码方面,某些密码的使用频率远高于其他密码。您需要做的就是获取这些密码的MD5并将其与一些哈希值进行比较,如果它们匹配,那么它是一个非常合理的猜测,它来自该密码。
您可能还有兴趣阅读one-to-one functions,Injective functions,cryptographic hash functions,MD5,SHA1和Don't Hash Secrets from the Benlog Security Blog。
答案 9 :(得分:1)
此外,由于多个字符串可以创建相同的MD5哈希值,因为它的数据少于输入字符串,所以其他任何哈希系统如何更好?
针对MD5的攻击是已知的,这使得攻击者可以使用不同的内容创建多个文档,但相同的 MD5哈希。这种攻击在计算上是可行的,并且作为示范,被用来“预测”总统选举的结果。 (攻击者在选举前发布了一个哈希值,然后发布了一个带有该哈希值的文档,给出了胜利者的名字。但实际上攻击者为每个候选人都有一份文档,都有相同的哈希值。)
更好的系统将提供加密保证,创建散列到相同值的两个不同文档在计算上是难以处理的。 SHA-1可能就是这样一个系统。
更糟糕的系统会允许攻击,从而可以访问任何哈希,您可以使用该哈希创建文档。古老的CRC系统仍然在许多硬件系统中使用(以太网),容易受到这种攻击。与MD5一样,它是一个散列函数,其中输出不能从输入重构,但是给定任何输出,构造具有给定CRC-32或CRC-64签名的文档是微不足道的。更糟糕的是,你可以在这样的文档中放入你喜欢的任何文本,然后通过最后添加垃圾来获得你想要的CRC。
CRC-32可以非常快速地计算,MD5需要更长的时间,而SHA-1需要更长的时间,这并非巧合。成本模型和信任模型都很难。
一个非常好的哈希函数将像CRC一样快速计算,并且难以构造两个文档散列到与SHA-1相同的值。不要屏住呼吸......
答案 10 :(得分:0)
基本上,涉及的位操作意味着逆转它在技术上是不可行的。为了构建一组输出,您需要疯狂的时间复杂性和巨大的内存复杂性。这根本不是不可能的 - 但它不一定是超出了我们最好的超级计算机一英里的力量。
答案 11 :(得分:0)
大多数答案都没有达到问题的真正意义:散列变换是非线性的,因此非常困难(但并非不可能,只要有足够的计算能力和时间)反转。
考虑平方数和获得平方根的相对困难。除此之外,您只有部分信息,所有缺失的位对于产生正确的答案非常重要(而不是在裁剪数字的示例中)。
如果您仍然不确定,那么请自行尝试颠倒MD5或任何其他加密哈希函数的步骤; - )
答案 12 :(得分:0)
字符串的熵增加,因为在散列过程中某些信息会丢失。这意味着没有足够的信息可用于重建原始字符串。