怎样才能“解密”MD5哈希?

可能重复:
MD5哈希值如何不可逆?

我正在读一个关于MD5的问题,这让我想起了让我感到厌烦的东西。 非常简单的问题,如果不是很好,我很抱歉。 我只是无法理解如何使用某种algorithm将某个东西转换成一个东西,并且没有办法使用相反的algorithm将其转换回来。

那么这怎么可能?

另外,由于多个string可以创build相同的MD5哈希,因为它比inputstringless,所以其他哈希系统会更好吗?

基本上,这是因为MD5的输出包含比input更less的信息。 这基本上是将散列algorithm与encryptionalgorithm区分开来的。

下面是一个简单的例子:设想一个algorithm来计算一个10位数字的散列。 该algorithm是“返回最后2位数”。 如果我拿8023798734的散列,我得到34,但如果你只有34,你将无法告诉原来的数字是什么,因为散列algorithm丢弃8位数字的信息。 它与MD5类似,不同之处在于散列是通过一个复杂的过程来计算的,而不是仅仅斩断部分数据。

那么一个散列怎么能比另一个好呢? 首先,不同的散列algorithm可以或多或less抵抗冲突 (当两个input产生相同的输出时)。 碰撞的概率与可能的散列输出的数量成反比。 碰撞是散列的一个不受欢迎的特性,因为如果数据发生变化,您也希望散列也发生改变,所以获得更好散列algorithm的一种方法是使用具有更多可能输出的散列。 在上面的数字例子中,取最后4位数字而不是最后2位数字,将与给定哈希(技术上称为“原像” )的冲突概率降低到10000而不是100,所以更有可能所有你所拥有的10位数字将有不同的散列值。

还有密码安全的问题。 当你想要使用散列来确保某些数据没有被篡改时,最好不pipe谁来进行篡改,都无法预测哪些input会产生给定的输出。 如果可能的话,他们将能够以输出(散列)保持不变的方式来改变input数据。 再次回到数字例子,假设我要通过电子邮件发送给您1879483129号码,这个号码保持不变是至关重要的 。 我可能会打电话给你,告诉你这个数字的哈希值是29,但是由于“最后2位数”algorithm不是密码安全的,所以一个黑客可以把数字改成5555555529,而你不会不知道区别。

已经显示MD5不是密码安全的 (并且SHA-1也被破坏 )。 这意味着可以find与任何给定输出相对应的不同input。 对于防止随机位翻转等等,它仍然是一个很好的algorithm,但是如果有人可能有意破坏你的数据,你应该使用更安全的东西,比如SHA-256或更高,可能作为HMAC的一部分计划 。

我只是无法理解如何使用某种algorithm将某个东西转换成一个东西,并且没有办法使用相反的algorithm将其转换回来。

你可以把牛变成汉堡,但是你不能把汉堡变成牛。

这种转换通过销毁数据来减less存在的数据,并且数据不能被恢复。

这是一个平行的:

加上你家人的年龄。 只保留最后两位数字。

现在根据这个数字告诉我每个人的年龄。

想想这个:

我有一个数字string,说它是“12345678”。

我有一个哈希algorithm,它只是返回所有单个数字的总和,我们称之为f()

所以,f(“12345678”)= 1 + 2+ .. + 8 = 36。

那么问题是:

已知f(x)= 36,是否有可能得到x的原始值?

我们不能,因为f()是algorithm导致信息丢失。

MD5是一个像f()这样的散列algorithm,但是要复杂得多。

这是一个简单的答案

有一定数量的哈希值,以及无限数量的可哈希值,明文值。

因此,颠倒给定的MD5散列会导致无限数量的可能的明文值。

在回答你的问题的第二部分(对第一部分的回答已经被上面的人充分地提供了):MD5被认为是脆弱的,因为certificate了对密码的攻击(即,可以在平原 – 不会导致MD5总和变化的文本)。 其他散列技术可能不容易受到本质上任意的散列冲突的影响(至less这样的任意冲突还没有被certificate对SHA-2散列集合是可能的),因此攻击者是不太可能在非MD5技术中复制哈希散列(理论上,哈希碰撞攻击当然可以用于任何散列函数;如果不是这样的话,它不会成功用作散列函数;问题是攻击者可以成功地“伪造”一个“正确的”明文,即散列到相同散列值的攻击者。

顺便说一下,明文的MD5和不一定是安全的,因为它包含“less”数据或者是“有损”的,但是因为从任意明文计算一个固定范围内的和值(对于明文<128位,实际上,MD5和包含比明文更多的信息),因此一个(理论上无限的)明文可以全部alignment到相同的MD5散列。

嗯,不要粗鲁,但在我看来,所有关于“信息less于进入”的答案都是错误的。

MD5和类似的encryption哈希码的主要用途是encryption密码。 在这种情况下,我不在乎是否可以重build原始string。 我所关心的是我是否可以构造任何将散列为相同值的string。

举一个简单的例子:假设我们的哈希algorithm是“取最后两位数”。 所以如果我的密码是“12345678”,哈希码是“78”。 有没有办法从“78”回到“12345678”? 但是,如果我盗用密码,我不在乎是否知道您的原始密码是什么。 我只是想要一个密码让我进来。所以如果我知道这是algorithm,我会说很好,我会使用密码“99978”。 它哈希到“78”,所以密码validationalgorithm会通过它,我在。

显然,MD5更难以逆转,即使在这个“任何可以散列到正确值的东西”的意义上,然后是一个简单的algorithm,如“取最后两位数”。 但是,这是不可能的? 这也让我感到困惑。 所以一定要丢弃信息。 但是,在信息被丢弃的地方填写任何随机值,我不能把它倒回到“任何”值吗? 我没有看到MD5的实际algorithm。 我认为这不是一件容易扭转的事情,就像改变一切琐事或者琐碎的事情,或者很久以前有人会这样做。 从那里有数以百万计的黑客试图破解这个事实,即使这在理论上是可能的,也是难以置信的。

考虑以下函数:f(x)= x x。 现在,假设你知道f(x)= 25,x是什么? 那么答案可能是5,答案可能是-5。 你不能恢复到f的input,因为在f的范围内存在一些值,使f的域的多个元素映射到f下的那个值。 因此,函数f是不可逆的。 相同的概念适用于MD5; MD5algorithm有多个input,尽pipe是不同的input,但是会产生相同的散列值。 换句话说,MD5algorithm,如f(x)= x x,不是一一对应的,因此不是一个可逆函数。

但是,这并不意味着您无法恢复到MD5的input。 这仅仅意味着你无法100%确定地恢复到MD5的input。 为了使这更具体,让我们再看看函数f(x)= x * x。 现在如果我告诉你,对于给定的任何input,它是正的概率是99%? 在这种情况下,你可以做一个很好的猜测,即25的散列值来自5的值,而不是-5。 实际上,这是人们如何能够破解散列函数(包括MD5,事实certificate,这不是一个很好的encryption散列函数)。 说到密码,有一些比其他密码更频繁使用的密码。 所有你需要做的是拿这些密码的MD5,并与一些哈希值进行比较,如果它们匹配,那么这是一个非常合理的猜测,它是来自该密码。

您可能也有兴趣阅读Benlog安全博客中 的一对一函数 , 内注函数 , encryption散列函数 , MD5 , SHA1和不哈希秘密 。

另外,由于多个string可以创build相同的MD5哈希,因为它比inputstringless,所以其他哈希系统会更好吗?

针对MD5的攻击是已知的,这使得攻击者可以创build具有不同内容但具有相同 MD5散列的多个文档。 这种攻击在计算上是可行的,作为示范,它被用来“预测”总统选举的结果。 (攻击者在选举前发布了一个散列,然后显示了一个文件,该散列给出了胜利者的名字,但实际上攻击者为每个候选者都有一个文件,所有文件都有相同的散列)。

一个更好的系统可以提供一个密码保证,即创build两个不同的文档来计算相同的值是非常困难的。 SHA-1可能是这样一个系统。

一个更糟糕的系统将允许一个攻击,由于给定访问任何哈希,你可以创build一个文件与该哈希。 历史悠久的CRC系统仍被许多硬件系统(如以太网)所使用,容易受到这种攻击。 像MD5一样,它是一个散列函数,其中输出不能从input重build,但是给定任何输出,构造具有给定CRC-32或CRC-64签名的文档是微不足道的。 更糟糕的是,你可以把任何你喜欢的文本放在这样的文档中,然后在最后join垃圾就可以得到你想要的CRC。

CRC-32的计算速度非常快,MD5花费的时间要长得多,而SHA-1花费的时间也比较长,这并非巧合。 成本模型和信任模型都很困难。

一个非常好的散列函数可以像计算CRC那样快速地计算,并且难以构build两个文件散列到与SHA-1相同的值。 不要屏住呼吸

另外,由于多个string可以创build相同的MD5哈希,因为它比inputstringless,所以其他哈希系统会更好吗?

尽pipe确实存在具有相同散列的多个(甚至是无限多个)消息,但是encryption散列的目标是使得find这样的冲突不可行。

你可能会想通过计算随机消息的散列来find冲突,直到你最终得到相同的结果两次。 但是,您会低估可能的哈希值空间的大小。

对于MD5,散列的大小是128位。 道格拉斯·亚当斯(Douglas Adams)的意思是128位的空间。 真的很大。 你不会相信它有多么巨大的意义。 可能的哈希数是2 128 ,或3.40282367×10 38 。 这是一个34之后37个零! 如果你能在一秒钟内达到万亿,那么通过所有的128位数字仍然需要100亿年的时间。

然而,像MD5这样的一些散列algorithm有一些弱点,使得攻击者可以用比蛮力尝试更less的努力来逆转它(即find一个给定散列值的消息)。 在这方面,MD5被认为是完全破碎的。

从本质上讲,所涉及的位操作意味着颠倒它在技术上是不可行的。 为了构build一组输出,您需要疯狂的时间复杂性和巨大的内存复杂性。 这根本不是不可能的,但它不一定是,即使超过我们最好的超级计算机的力量,也不会超过一英里。

大部分的答案都没有达到这个问题的真正意义: 哈希变换是非线性的 ,因此非常困难(但不是不可能,只要有足够的计算能力和时间)就可以逆转。

想想平方数和平方根的相对难度。 除此之外,你只是有部分信息,所有的缺失位是非常重要的,以产生正确的答案(不像裁剪数字的例子)。

如果毕竟还是不确定的话,那就试试自己去颠倒MD5或者其他任何encryption散列函数的步骤;-)

随着一些信息在散列过程中丢失,string的熵增加。 这意味着没有足够的信息来重build原始string。