是否有可能解密MD5哈希?

时间:2009-08-06 19:25:24

标签: hash cryptography md5 encryption

有人告诉我,他见过软件系统:

  1. 从其他系统检索MD5加密密码;
  2. 解密加密密码和
  3. 使用系统自己的算法将密码存储在系统数据库中。
  4. 这可能吗?我认为解密MD5哈希是不可能/不可行的。

    我知道有MD5词典,但是有没有实际的解密算法?

24 个答案:

答案 0 :(得分:392)

没有。 MD5不是加密(尽管它可以用作某些加密算法的一部分),它是单向hash function。许多原始数据实际上是“失去”作为转型的一部分。

想一想:MD5总是128位长。这意味着有2个 128 可能的MD5哈希值。这是一个相当大的数字,但它绝对是有限的。然而,给定的散列函数有无数个可能的输入(并且它们中的大多数包含超过128位,或者只有16个字节)。因此,对于将散列到相同值的数据实际上存在无限多种可能性。使哈希变得有趣的是,找到两个散列到相同值的数据是非常困难的,并且它偶然发生的几率几乎为0.

(非常不安全)哈希函数的一个简单示例(这说明它是单向的一般概念)是获取一段数据的所有位,并将其视为大数。接下来,使用一些大的(可能是素数) n 执行整数除法,并取余数(参见:Modulus)。您将在0和 n 之间留下一些数字。如果您再次执行相同的计算(任何时间,在任何计算机上,任何地方),使用完全相同的字符串,它将提供相同的值。然而,没有办法找出原始值是什么,因为当除以 n 时,有无数个具有完全余数的数字。

也就是说,已发现MD5存在一些弱点,因此通过一些复杂的数学运算,可能无需尝试2 128 可能的输入字符串就能找到碰撞。事实上,大多数密码都很短,人们经常使用常用值(如“密码”或“秘密”)意味着在某些情况下,您可以通过Google搜索哈希或使用{来对某人的密码进行合理的猜测。 {3}}。这就是为什么你应该总是“Rainbow table”散列密码的一个原因,这样两个相同的值在散列时不会散列到相同的值。

一旦数据通过哈希函数运行,就不会再回头了。

答案 1 :(得分:154)

你不能 - 理论上。哈希的全部意义在于它只是一种方式。这意味着如果有人设法获取哈希列表,他们仍然无法获取您的密码。此外,这意味着即使有人在多个站点上使用相同的密码(是的,我们都知道我们不应该,但是......)任何有权访问站点A数据库的人都无法使用用户的密码网站B.

MD5是哈希的事实也意味着它丢失了信息。对于任何给定的MD5哈希,如果允许任意长度的密码,可能会有多个密码产生相同的哈希值。对于一个好的哈希,在计算上不可能找到它们超出一个非常微不足道的最大长度,但这意味着没有保证,如果你找到一个具有目标哈希的密码,它肯定是原始密码。 天文学上不太可能你会看到两个只有ASCII,合理长度的密码具有相同的MD5哈希值,但这并非不可能。

MD5是用于密码的错误哈希:

  • 这很快,这意味着如果你有一个“目标”哈希,尝试大量密码并查看是否可以找到一个哈希到该目标的便宜是很便宜的。 Salting对那个场景没有帮助,但是尝试使用不同的盐来找到与多个哈希中的任何一个匹配的密码会有所帮助。
  • 我相信它已经知道了更容易发现碰撞的缺陷,尽管在可打印文本中找到碰撞(而不是任意二进制数据)至少会更难。

我不是安全专家,因此除了“不要推出自己的身份验证系统”之外,不会提出具体建议。从信誉良好的供应商那里找到一个,并使用它。安全系统的设计和实现都是一项棘手的工作。

答案 2 :(得分:53)

从技术上讲,这是'可能',但在非常严格的条件rainbow tables下,根据用户密码的极小可能性进行强制执行哈希数据库)。

但这并不意味着它是

  • 存活
  • 安全

您不希望“反转”MD5哈希。使用下面列出的方法,您将永远不需要。 “逆转”MD5实际上被认为是恶意 - 一些网站提供了“破解”和暴力破解MD5哈希的能力 - 但它们都是包含字典单词,以前提交的密码和其他单词的大型数据库。有一个非常小的机会它将需要反转MD5哈希。 如果你有salted MD5哈希 - 这也行不通! :)


使用MD5哈希进行登录的方式是:

注册期间: 用户创建密码 - >使用MD5对密码进行哈希处理 - >存储在数据库中的哈希

登录期间:
用户输入用户名和密码 - > (用户名已选中)使用MD5对密码进行哈希处理 - >将哈希与数据库中的存储哈希进行比较

当需要“忘记密码”时
2个选项:

  • 用户发送了一个随机密码进行登录,然后在第一次登录时发生错误更改。


  • 向用户发送更改密码的链接(如果您有安全问题/等额外检查),然后新密码被哈希并用数据库中的旧密码替换

答案 3 :(得分:32)

不直接。由于pigeonhole principle,(可能)有多个值散列到任何给定的MD5输出。因此,你无法肯定地扭转它。此外,MD5使得很难找到任何这样的反向散列(但是有一些攻击会产生collisions - 也就是说,产生两个散列到相同结果的值,但是你无法控制产生的MD5值是什么。)

但是,如果将搜索空间限制为(例如)长度小于N的常用密码,则可能不再具有不可逆性属性(因为MD5输出的数量远远大于域中的字符串数量)利益)。然后你可以使用rainbow table或类似的反向哈希值。

答案 4 :(得分:13)

不可能,至少在合理的时间内没有。

通常处理的方式是密码“重置”。也就是说,您给他们一个新的(随机)密码并将其发送到电子邮件中。

答案 5 :(得分:12)

您无法恢复md5密码。(使用任何语言)

但你可以:

给用户一个新的。

检查一些彩虹表,以便找回旧的。

答案 6 :(得分:9)

不,他一定对MD5词典感到困惑。

加密哈希(MD5等)单向你只能使用摘要回到原始邮件,除非你还有其他一些关于原始信息等的信息,你不应该这样做。

答案 7 :(得分:8)

解密(以算法的方式直接从散列值中获取纯文本),no。

然而,有些方法使用所谓的rainbow table。如果您的密码在没有盐的情况下进行哈希处理,这是非常可行的。

答案 8 :(得分:7)

MD5是一种散列算法,您无法恢复散列值。

您应该添加“更改密码功能”,其中用户提供另一个密码,计算哈希值并将其存储为新密码。

答案 9 :(得分:7)

没有简单的方法可以做到这一点。这是首先对密码进行哈希处理的一点。 :)

应该能够做的一件事是手动为它们设置一个临时密码并发送给它们。

我毫不犹豫地提到这一点,因为这是一个坏主意(并且无论如何都无法保证工作),但您可以尝试在milw0rm这样的彩虹表中查找哈希,看看是否可以恢复旧密码那样。

答案 10 :(得分:6)

请在此处查看所有其他答案,了解如何以及为何不可逆转以及为什么您不想要这样做。

为了完整性,有rainbow tables可以查找可能匹配的内容。无法保证彩虹表中的答案将是您的用户选择的原始密码,这样会使它们大为混淆。

此外,这不适用于盐渍哈希。许多安全专家建议Salting

答案 11 :(得分:4)

在找到哈希函数的反函数方面,没有办法“恢复”哈希函数。如前所述,这是具有哈希函数的重点。它不应该是可逆的,它应该允许快速哈希值计算。因此,找到产生给定散列值的输入字符串的唯一方法是尝试所有可能的组合。由于这个原因,这被称为蛮力攻击。

尝试所有可能的组合需要花费大量时间,这也是哈希值以相对安全的方式存储密码的原因。如果攻击者能够使用所有用户密码访问您的数据库,则无论如何都会松动。如果你有哈希值和(理想情况下)强密码,那么从攻击者的哈希值中获取密码会更加困难。

存储哈希值也不是性能问题,因为计算哈希值相对较快。因此,大多数系统所做的是计算用户键入的密码的哈希值(这很快),然后将其与用户数据库中存储的哈希值进行比较。

答案 12 :(得分:3)

MD5被认为是破碎的,不是因为你可以从哈希中取回原始内容,而是因为有了工作,你可以制作两个散列到相同哈希的消息。

您不能取消哈希MD5哈希值。

答案 13 :(得分:2)

唯一可以工作的是(如果我们提到密码只是哈希,没有添加任何盐来防止重放攻击,如果是这样你必须知道盐)顺便说一句,得到一个字典攻击工具,许多单词,数字等文件然后创建两行,一行是单词,数字(在字典中),另一行是单词的哈希值,并比较哈希值,如果匹配你得到它... < / p>

这是唯一的方法,无需进入密码分析。

答案 14 :(得分:2)

您可以找到使用字典检索原始邮件的在线工具。

在某些情况下,字典方法可能没用:

  • 如果使用SALT消息对消息进行哈希处理
  • 如果邮件多次哈希

例如,这是一个MD5 decrypter在线工具。

答案 15 :(得分:2)

是的,正是您所要求的是可能的。 无法解密&#39;没有帮助的MD5密码,但可以将MD5密码重新加密到另一个算法中,而不是一次性完成。

您所做的是安排您的用户使用旧的MD5密码登录新系统。在他们登录时,他们已经为您的登录程序提供了一个未散列版本的密码,您证明该密码与您拥有的MD5哈希值相匹配。然后,您可以将此未散列的密码转换为新的散列算法。

显然,这是一个扩展过程,因为您必须等待用户告诉您密码是什么,但它确实有效。

(注意:七年后,哦,希望有人会发现它很有用)

答案 16 :(得分:1)

不,它无法完成。要么你可以使用字典,要么你可以尝试散列不同的值,直到你得到你正在寻找的哈希值。但它无法“解密”。

答案 17 :(得分:1)

MD5有它的弱点(见Wikipedia),所以有一些项目试图预先计算哈希。维基百科也暗示了其中一些项目。我所知道的(和尊重)是ophrack。您无法告诉用户他们自己的密码,但您可以告诉他们一个有效的密码。但我认为:只要邮寄新密码就可以忘记了。

答案 18 :(得分:1)

理论上无法解密哈希值,但是你有一些肮脏的技术可以恢复原始纯文本。

  1. 强制执行:所有计算机安全算法都会遇到bruteforcing。基于这个想法,今天的GPU采用并行编程的思想,使用它可以通过使用任何图形处理器大规模地强制它来恢复纯文本。这个工具hashcat完成了这项工作。上次我检查了它的cuda版本时,我能够在六分钟内强行使用一个7个字母的字符。
  2. 互联网搜索:只需在Google上复制并粘贴哈希,然后查看是否可以在那里找到相应的明文。当你在测试某些东西时,这不是一个解决方案,但绝对值得一试。有些网站维护字典中几乎所有单词的哈希值。

答案 19 :(得分:1)

MD5哈希算法不可逆,因此MD5解码不可能,但有些网站有大量的密码匹配,所以你可以尝试在线解码MD5哈希。

在线试用:

MD5 Decrypt

md5online

md5decrypter

答案 20 :(得分:1)

否,不可能反转诸如MD5之类的哈希函数:给定输出哈希值,除非知道有关输入消息的足够信息,否则不可能找到输入消息。

解密不是为哈希函数定义的函数。加密和解密是密码的功能,例如CBC模式下的AES;哈希函数不会加密解密哈希函数用于消化输入消息。顾名思义,设计上不可能有反向算法


MD5被设计为一种加密安全的单向哈希函数。现在,即使大部分输入消息是预先确定的,也很容易为MD5生成冲突。因此,MD5正式被破解,MD5不应再被视为加密安全的哈希。但是,仍然不可能找到导致哈希值的输入消息:仅知道H(X)时查找X(并且X不具有带有至少一个128字节预计算数据块的预计算结构)。 。没有针对MD5的已知的映像前攻击

通常还可以使用蛮力或(增强的)字典攻击来猜测密码,比较数据库或尝试在所谓的Rainbow表中查找密码哈希。如果找到匹配项,则在计算上可以确定已找到输入。散列函数也很安全,可以防止冲突攻击:找到X',使H(X') = H(X)赋予H(X)。因此,如果找到了X,则可以确定它确实是输入消息。否则,您毕竟会进行碰撞攻击。 Rainbow表可用于加快攻击速度,并且那里有专门的Internet资源,可帮助您在给定特定哈希值的情况下找到密码。

当然可以重新使用哈希值H(X) 来验证在其他系统上生成的密码。接收系统唯一要做的就是存储将F作为输入的确定性函数H(X)的结果。将X赋予系统后,可以重新计算H(X)F并比较结果。换句话说,不需要解密散列值只是验证密码正确,您仍然可以将散列存储为其他值。


代替MD5,重要的是使用密码哈希或PBKDF(基于密码的密钥派生功能)。这样的函数指定如何将与哈希一起使用。这样,就不会为相同的密码(从其他用户或在其他数据库中)生成相同的哈希。由于这个原因,密码哈希也不允许使用彩虹表,只要盐足够大并且可以适当地随机分配。

密码哈希还包含一个工作因子(有时使用迭代次数进行配置),可以大大减慢尝试根据给定的盐和哈希值查找密码的攻击。这很重要,因为带有盐和哈希值的数据库可能会被盗。最后,密码哈希也可能是难以记忆的,因此需要大量内存来计算哈希。这使得不可能使用特殊的硬件(GPU,ASIC,FPGA等)来使攻击者加快搜索速度。其他输入或配置选项(例如Pepper或并行化量)也可用于密码哈希。

但是,即使H(X)是密码哈希,它仍然允许任何人验证给定H(X)的密码。密码哈希仍然是确定性的,因此,如果有人知道所有输入和哈希算法本身,则可以使用X来计算H(X),并且-可以再次比较结果。

常用的密码哈希为 bcrypt scrypt PBKDF2 。另外还有各种形式的 Argon2 ,它是最近发生的合理的密码哈希竞赛的获胜者。 Here on CrackStation是一篇有关进行密码安全保护的不错的博客文章。


可能使对手无法执行哈希计算,以验证密码是否正确。为此,可以将Pepper用作密码哈希的输入。或者,当然可以使用诸如AES的密码和诸如CBC或GCM的操作模式对哈希值进行加密。但是,这需要独立地存储秘密/密钥,并且具有比密码哈希更高的访问要求。

答案 21 :(得分:-1)

还不可能将密码的哈希值放入算法中并以纯文本形式返回密码,因为哈希是一种单向的方式。但人们所做的是生成哈希并将其存储在一个大表中,这样当您输入特定哈希时,它会检查表中是否有与哈希匹配的密码并将该密码返回给您。执行此操作的网站示例为http://www.md5online.org/。现代密码存储系统通过使用盐析算法对此进行计数,这样当您在注册期间在密码框中输入相同的密码时,会生成不同的哈希值。

答案 22 :(得分:-1)

否,您不能解密/反向md5,因为它是单向加密。但是某些网站上有大量的密码数据库集,因此您可以尝试在线解码MD5或SHA1哈希字符串。 我尝试过像website这样的http://www.mycodemyway.com/encrypt-and-decrypt/md5,它对我来说很好用,但这完全取决于您的哈希,如果该哈希存储在该数据库中,那么您可以获得实际的字符串。

答案 23 :(得分:-1)

MD5是一种加密(单向)哈希函数,因此没有直接的方法对其进行解码。加密散列函数的全部目的是您不能撤消它。

您可以做的一件事是蛮力策略,您可以猜测要进行哈希处理的内容,然后使用相同的函数对其进行哈希处理,看看是否匹配。除非很容易猜测散列数据,否则可能要花很长时间。