首页 文章

怎么不可能“解密”MD5哈希? [重复]

提问于
浏览
43

可能重复:MD5哈希值怎么不可逆?

我正在读一个关于MD5的问题,它让我记住了令我难以置信的事情 . 非常简单的问题,如果它不是一个好的我很抱歉 . 我只是无法理解你是如何使用某种算法将某些东西转换为一种东西的,并且无法使用该算法反向转换回来 .

那怎么可能呢?

此外,由于多个字符串可以创建相同的MD5哈希值,因为它的数据少于输入字符串,所以其他任何哈希系统如何更好?

13 回答

  • 0

    这是一个简单的答案......

    存在有限数量的散列值,以及无限数量的可散列明文值 .

    因此,反转给定的MD5散列将导致无限数量的可能明文值 .

  • 2

    回答你问题的第二部分(第一部分的答案已被上面的其他人充分给出):MD5被认为是弱的,因为攻击密码的证据(即,可以在平原上做出的改变) - 不会导致更改的文本MD5总和) . 其他散列技术可能不容易受到基本上任意的散列冲突的影响(至少这样的任意冲突还没有被证明可以用SHA-2哈希集合等),因此,攻击者是在非MD5技术中不太可能复制哈希散列(理论上,当然,散列冲突攻击可能对任何散列函数;如果不是这样,它就不会成为散列函数;问题是攻击者能够轻易地“伪造”一个“正确”的明文,即散列到相同散列值的明文 .

    顺便提一下,明文的MD5和不一定是安全的,因为它包含“较少”数据或“有损”,但是因为从任意明文中计算出固定范围内的和值(对于明文<128位,事实上,MD5总和包含的信息比明文...更多,因此明文的数量(理论上无穷大)都可以与同一个MD5哈希对齐 .

  • 2

    基本上是因为MD5的输出包含的信息少于输入 . 这基本上是区分哈希算法和加密算法的原因 .

    这是一个简单的例子:想象一个算法来计算一个10位数的哈希值 . 该算法是“返回最后2位数” . 如果我采用8023798734的哈希值,我得到34,但是如果你只有34,你将无法分辨原始数字是什么,因为哈希算法丢弃了8位数的信息 . 它与MD5类似,不同之处在于散列是通过复杂的过程计算的,而不是仅仅切断部分数据 .

    那么一个哈希怎么能比另一个好呢?首先,不同的散列算法可以或多或少地抵抗冲突(当两个输入产生相同的输出时) . 碰撞的概率与可能的散列输出的数量成反比 . 碰撞是散列的一个不合需要的特性,因为如果你的数据发生了变化,你也希望散列也改变,所以获得更好的散列算法的一种方法是使用具有更多可能输出的散列 . 在上面的数字示例中,取最后4位数而不是最后2位数将与给定散列(技术上称为原像)发生碰撞的概率降低到10000(而不是100)中的1,因此更有可能全部无论您拥有什么样的集合,10位数字都会有不同的哈希值 .

    有希望的是,无论谁预测哪些输入都会产生给定的输出 . 如果可以,他们将能够以输出(散列)保持不变的方式改变输入数据 . 再回到数字示例,让's say I' m打电话给你,电话号码为1879483129,这个数字对你没有改变是至关重要的 . 我可能会打电话给你并告诉你这个数字的哈希值是29,但由于"last 2 digits"算法不具有加密安全性,一个邪恶的黑客可以改变途中的号码,例如5555555529,你不会知道区别 .

    已经显示MD5 is not cryptographically secure(和SHA-1 is also compromised) . 这意味着可以找到与任何给定输出相对应的不同输入 . 有人可能想故意破坏你的数据,你应该使用更安全的东西,比如SHA-256或更高版本,可能是as part of an HMAC scheme .

  • 0

    我只是无法理解你是如何使用某种算法将某些东西转换为一种东西的,并且无法使用该算法反向转换回来 .

    你可以把牛变成汉堡包,但你不能把汉堡变成牛 .

    转换通过销毁它来减少存在的数据,并且无法恢复数据 .

  • 82

    这是一个平行的:

    加上你家里每个人的年龄 . 只保留最后两位数字 .

    现在告诉我每个人的年龄基于那个数字 .

  • 1

    想一想:

    我有一个数字字符串,说它是“12345678” .

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

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

    那么问题是:

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

    我们不能,因为f()是一种算法导致信息丢失 .

    MD5是一个像f()这样的哈希算法,但要复杂得多 .

  • 2

    嗯,不要太粗鲁,但在我看来,关于“出现的信息少而不是进入”的所有答案都忽略了这一点 .

    MD5和类似的加密哈希码的主要用途是加密密码 . 在这种情况下,我不关心是否可以重建原始字符串 . 所有我关心的是我是否可以构造任何会散列到相同值的字符串 .

    举一个简单的例子:假设我们的哈希算法是“取最后两位数字” . 因此,如果我的密码是“12345678”,则哈希码为“78” . 有没有办法从“78”回到“12345678”?不 . 但是,如果我是黑客密码,我不在乎我是否知道您的原始密码是什么 . 我只想要一个密码让我进去 . 所以如果我知道这是算法,我会说很好,我会使用密码“99978” . 它哈希到“78”,所以密码验证算法将通过它,我在 .

    显然,MD5更难以反转,即使在“任何会散布到正确值的任何东西”的意义上,然后是一个简单的算法,如“取最后两位数字” . 但它真的不可能吗?这也让我很困惑 . 当然,信息在此过程中被丢弃 . 但是,在丢弃信息的任何地方,通过填写任何随机值,我不能反转为“任何”值吗?我还没有看过MD5的实际算法 . 我认为这不是一件容易扭转的事情,比如将所有的优点改为微不足道的东西或类似的那些微不足道的东西,或者很久以前有人会这样做 . 事实上,有数百万黑客试图破解这一点,即使理论上可行,也一定非常困难 .

  • 0

    考虑以下函数:f(x)= xx . 现在,假设你知道f(x)= 25,x是什么?嗯,答案可能是5或答案可能是-5 . 您无法将输入恢复为f,因为在f的范围内存在一些值,使得f的域的多个元素映射到f下的该值 . 因此,函数f是不可逆的 . 同样的概念适用于MD5; MD5算法有多个输入,尽管输入不同,但会产生相同的散列值 . 换句话说,MD5算法,如f(x)= xx,不是一对一的,因此不是可逆函数 .

    但是,这并不意味着您无法恢复MD5的输入 . 它只是意味着您无法100%确定地恢复输入和MD5 . 为了使这更具体,让我们再看一下函数f(x)= x * x . 现在,如果我告诉你,对于f的任何给定输入,它为正的概率是99%?在这种情况下,您可以非常好地猜测25的散列来自值5而不是-5 . 实际上,这是人们如何能够破坏哈希函数(包括MD5,事实证明,这不是一个非常好的加密哈希函数) . 在密码方面,某些密码的使用频率远高于其他密码 . 您需要做的就是获取这些密码的MD5并将其与一些哈希进行比较,如果它们匹配,那么它是一个非常合理的猜测,它来自该密码 .

    您可能还有兴趣阅读one-to-one functionsInjective functionscryptographic hash functionsMD5SHA1Don't Hash Secrets from the Benlog Security Blog .

  • 1

    此外,由于多个字符串可以创建相同的MD5哈希值,因为它的数据少于输入字符串,所以其他任何哈希系统如何更好?

    已知攻击MD5使攻击者可以创建具有不同内容但具有相同MD5哈希的多个文档 . 这种攻击在计算上是可行的,并且作为示威,被用于总统选举的结果 . (攻击者在选举前发布了一个哈希值,然后发布了一个带有该哈希值的文档,给出了胜利者的名字 . 但实际上攻击者为每个候选人都有一个文档,所有文档都有相同的哈希值 . )

    更好的系统将提供加密保证,创建散列到相同值的两个不同文档在计算上是难以处理的 . SHA-1可能就是这样一个系统 .

    更糟糕的系统将允许攻击,从而可以访问任何哈希,您可以使用该哈希创建文档 . 古老的CRC系统仍然在许多硬件系统中使用(以太网),容易受到这种攻击 . 与MD5一样,它是一个散列函数,其中输出不能从输入重构,但是给定任何输出,构造具有给定CRC-32或CRC-64签名的文档是微不足道的 . 更糟糕的是,你可以在这样的文档中放入你喜欢的任何文本,然后通过最后添加垃圾来获得你想要的CRC .

    CRC-32可以非常快速地计算,MD5需要更长时间,而SHA-1需要更长的时间,这并非巧合 . 成本模型和信任模型都很难 .

    一个非常好的散列函数将像CRC一样快速计算,并且难以构造两个文档散列到与SHA-1相同的值 . 不要屏住呼吸......

  • 1

    此外,由于多个字符串可以创建相同的MD5哈希值,因为它的数据少于输入字符串,所以其他任何哈希系统如何更好?

    虽然确实存在多个(甚至无限多个)具有相同散列的消息,但加密散列的目标是使得找到这样的冲突变得不可行 .

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

    对于MD5,散列的大小为128位 . 道格拉斯·亚当斯(Douglas Adams)的话说,128位的空间很大 . 真的很大 . 你只是不会相信这是多么大的令人惊讶的大 . 可能的哈希数是2128,或3.40282367×1038 . 这是一个34后跟37个零!如果你可以在一秒钟内计算到万亿,那么通过所有128位数字仍需要100亿美元 .

    然而,像MD5这样的一些散列算法具有允许攻击者逆转它的弱点(即,找到具有给定散列的消息),与仅仅强力尝试相比,其努力要少得多 . 在这方面,MD5被认为是完全破碎的 .

  • 102

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

  • 16

    大多数答案都没有达到问题的真正意义:因此,如果有足够的计算能力和时间,反转就很困难(但并非不可能) .

    想想平方数和得到平方根的相对困难 . 除此之外,您只有部分信息,所有缺失的位对于产生正确的答案非常重要(而不是在裁剪数字的示例中) .

    如果你仍然不确定,那么请自己尝试颠倒MD5或任何其他加密哈希函数的步骤;-)

  • 3

    由于在散列过程中丢失了一些信息,因此字符串的熵增加 . 这意味着没有足够的信息可用于重建原始字符串 .

相关问题