关于哈希:是否有可能解密MD5哈希?

Is it possible to decrypt MD5 hashes?

有人告诉我他看到过软件系统:

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

    我知道有MD5字典,但有实际的解密算法吗?


    不,MD5不是加密(尽管它可能被用作某些加密算法的一部分),它是单向哈希函数。作为转换的一部分,许多原始数据实际上是"丢失"的。

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

    对于一个(非常不安全的)哈希函数(这说明了它是单向的)的一个简单示例是获取一段数据的所有位,并将其视为一个大数字。接下来,使用一些大的(可能是质数)数n执行整数除法,并取余数(请参见:模数)。您将得到一个介于0和N之间的数字。如果您要使用完全相同的字符串再次执行相同的计算(任何时间、任何计算机、任何位置),它将得到相同的值。然而,还没有办法知道原始值是什么,因为当除以n时,有无限多的数字具有精确的余数。

    也就是说,MD5已经被发现有一些弱点,例如,在一些复杂的数学中,可以在不尝试2128个可能的输入字符串的情况下找到冲突。事实上,大多数密码都很短,人们经常使用公共值(如"密码"或"秘密"),这意味着在某些情况下,你可以通过谷歌搜索哈希或使用彩虹表来合理地猜测某人的密码。这就是为什么您应该总是"salt"散列密码的原因之一,这样当散列时,两个相同的值就不会散列到相同的值。

    一旦一段数据通过散列函数运行,就不会返回。


    理论上你不能。散列的关键是它只是一种方式。这意味着,如果有人设法获得哈希列表,他们仍然无法获得您的密码。另外,这意味着即使有人在多个站点上使用相同的密码(是的,我们都知道不应该这样做,但是…)任何有权访问站点A的数据库的人都将无法在站点B上使用用户的密码。

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

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

    • 它很快,这意味着如果你有一个"目标"散列,尝试大量的密码并看看你是否能找到一个散列到目标的散列值是很便宜的。salting对这种情况没有帮助,但它有助于增加使用不同盐的多个哈希中的任何一个匹配密码的开销。
    • 我相信它已经知道了一些缺陷,可以更容易地发现冲突,尽管在可打印文本(而不是任意二进制数据)中发现冲突至少会更困难。

    我不是一个安全专家,所以除了"不要使用你自己的认证系统"之外,我不会提出具体的建议。找一个信誉良好的供应商,然后使用它。安全系统的设计和实现都是一项棘手的工作。


    从技术上讲,这是"可能的",但在非常严格的条件下(彩虹表,基于用户密码在哈希数据库中的可能性非常小的暴力强制)。

    但这并不意味着

    • 可行的或
    • 安全的

    您不想"反转"MD5哈希。使用下面概述的方法,您将不需要这样做。"反转MD5实际上被认为是恶意的——一些网站提供了破解和暴力破解MD5散列的能力——但它们都是包含字典单词、以前提交的密码和其他单词的大型数据库。有一个非常小的机会,它将有MD5哈希你需要逆转。如果你已经用盐腌制了MD5哈希-这也不管用!:)

    使用MD5哈希的登录方式应该是:注册期间:用户创建密码->使用MD5对密码进行散列->存储在数据库中的散列

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

    当需要"丢失密码"时:2个选项:

    • 用户发送了一个随机密码以登录,然后在第一次登录时被窃听以更改密码。

    • 向用户发送一个链接以更改其密码(如果您有安全问题,则进行额外检查/etc),然后对新密码进行哈希处理,并用数据库中的旧密码替换新密码。


    不是直接的。由于鸽子洞原理,有(可能)多个值散列到任何给定的MD5输出。因此,你不能确定地逆转它。此外,MD5使得很难找到任何这样的反向散列(然而,有一些攻击会产生冲突——也就是说,生成两个散列到相同结果的值,但您无法控制生成的MD5值是什么)。

    但是,如果将搜索空间限制为(例如)长度小于n的普通密码,则可能不再具有不可逆属性(因为MD5输出的数量远远大于感兴趣域中的字符串数量)。然后您可以使用彩虹表或类似的反向散列。


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

    这通常是通过密码"重置"来处理的。也就是说,你给他们一个新的(随机的)密码,然后通过电子邮件发送给他们。


    无法还原MD5密码。(任何语言)

    但你可以:

    给用户一个新的。

    登记一些彩虹桌,也许可以取回旧的。


    不,他一定对MD5字典很困惑。

    加密散列(MD5等)是一种方法,只有摘要才能返回到原始消息,除非您有关于原始消息的其他信息,等等,您不应该这样做。


    解密(通过算法直接从哈希值中获取纯文本),没有。

    然而,也有一些方法使用所谓的彩虹表。如果你的密码是无盐散列的,那是非常可行的。


    做这件事不容易。首先,这就是散列密码的要点。:)

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

    我不愿意提这个,因为这是一个坏主意(而且无论如何也不能保证有效),但是你可以尝试在彩虹表(如milw0rm)中查找散列值,看看你是否可以这样恢复旧密码。


    MD5是散列算法,不能还原散列值。

    您应该添加"更改密码功能",用户在其中提供另一个密码,计算散列并将其存储为新密码。


    看看这里所有其他的答案,关于它是如何和为什么是不可逆的,以及为什么你无论如何都不想这样。

    为了完整起见,有彩虹表,您可以在上面查找可能的匹配项。不能保证彩虹表中的答案是您的用户选择的原始密码,这样会使他们非常困惑。

    此外,这对盐渍大麻也不起作用。许多安全专家都推荐使用盐渍法。


    在查找哈希函数的反函数时,无法"还原"哈希函数。如前所述,这是拥有散列函数的全部要点。它不应该是可逆的,并且应该允许快速的散列值计算。因此,找到产生给定哈希值的输入字符串的唯一方法是尝试所有可能的组合。因为这个原因,这被称为蛮力攻击。

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

    存储散列值也没有性能问题,因为计算散列值的速度相对较快。所以大多数系统所做的就是计算用户输入的密码的散列值(这很快),然后将其与用户数据库中存储的散列值进行比较。


    MD5被认为是中断的,不是因为您可以从散列返回原始内容,而是因为通过工作,您可以将两条消息散列到同一散列。

    不能取消对MD5哈希的哈希。


    是的,你想要的正是可能的。在没有帮助的情况下,"解密"MD5密码是不可能的,但是可以将MD5密码重新加密到另一个算法中,而不是一次完成所有操作。

    您所做的是安排您的用户能够使用旧的MD5密码登录到新系统。在他们登录的时候,他们给了你的登录程序一个未显示的密码版本,你证明这个版本与你拥有的MD5散列相匹配。然后您可以将这个未显示的密码转换为新的哈希算法。

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

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


    唯一能起作用的是(如果我们提到密码只是散列,不添加任何类型的salt来防止重播攻击,如果是这样的话,你必须知道salt),顺便得到一个字典攻击工具,许多单词、数字等的文件,然后创建两行,一行是单词、数字(在字典中),另一行是散列如果匹配的话,比较哈希值…

    这是唯一的方法,不需要进行密码分析。


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

    在某些情况下,字典方法可能是无用的:

    • 如果使用salt消息散列消息
    • 如果消息是哈希多次

    例如,这里有一个MD5解密器在线工具。


    MD5有其弱点(见维基百科),所以有一些项目试图预先计算哈希。维基百科也暗示了其中的一些项目。我所知道(和尊重)的是奥普拉克。您不能告诉用户自己的密码,但您可以告诉他们一个有效的密码。但我想:只要给他们寄一个新密码,以防他们忘记。


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

    尝试联机:

    MD5解密

    MD5在线

    MD5减速器


    理论上,不可能对哈希值进行解密,但您有一些肮脏的技术可以让原始的纯文本返回。

  • 暴力变形:所有计算机安全算法都遭受暴力变形。基于这个观点,今天的GPU采用了并行编程的思想,它可以通过使用任何图形处理器对纯文本进行大量的暴力处理来获取纯文本。这个工具hashcat完成这个工作。上一次我查看CUDA版本时,我能在六分钟内粗暴地造出一个7个字母长的字符。
  • 互联网搜索:只需复制并粘贴谷歌上的散列,看看你是否能在那里找到相应的纯文本。这不是一个解决方案,当你正在测试的东西,但它绝对值得一试。有些网站维护字典中几乎所有单词的哈希值。

  • 不,不可能。要么你可以使用字典,要么你可以尝试散列不同的值,直到你得到你正在寻找的散列。但它不能"解密"。


    不,不能反转散列函数(如MD5):给定输出散列值,除非知道输入消息的足够信息,否则无法找到输入消息。好的。

    解密不是为哈希函数定义的函数;加密和解密是密码的函数,如CBC模式下的AES;哈希函数不加密或解密。哈希函数用于对输入消息进行摘要。顾名思义,设计时不可能有逆向算法。好的。

    MD5被设计成一个加密安全的单向散列函数。现在很容易为MD5生成冲突——即使输入消息的很大一部分是预先确定的。因此,MD5被正式破坏,MD5不应该再被视为密码安全散列。然而,仍然无法找到导致哈希值的输入消息:当只知道h(x)时查找x(并且x没有预先计算的结构,其中至少有一个128字节的预计算数据块)。没有已知的针对MD5的预映像攻击。好的。

    通常也可以使用蛮力或(增强)字典攻击来猜测密码,比较数据库或尝试在所谓的彩虹表中查找密码哈希。如果找到匹配项,则在计算上确定已找到输入。散列函数也可以防止碰撞攻击:找到X',以便H(X') = H(X)给定H(X)。因此,如果发现一个X在计算上是确定的,它确实是输入消息。否则,您将执行碰撞攻击。彩虹表可以用来加速攻击,并且有专门的互联网资源可以帮助您在给定哈希值的情况下找到密码。好的。

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

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

    密码散列还包含一个工作因子(有时使用迭代计数配置),可以显著降低试图在给定salt和hash值的情况下找到密码的攻击。这一点很重要,因为包含盐和哈希值的数据库可能会被盗。最后,密码散列也可能是内存硬的,因此计算散列需要大量内存。这使得不可能使用特殊硬件(GPU、ASIC、FPGA等)来让攻击者加速搜索。密码散列还可以使用其他输入或配置选项,如胡椒或并行化量。好的。

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

    常用的密码散列是bcrypt、scrypt和pbkdf2。还有各种形式的argon2,是最近密码散列竞争的赢家。在CrackStation上有一篇很好的关于做好密码安全的博客文章。好的。

    有可能使对手无法执行哈希计算,从而验证密码是否正确。为此,可以使用胡椒作为密码哈希的输入。或者,哈希值当然可以使用密码(如aes)和操作模式(如cbc或gcm)加密。但是,这需要独立地存储一个秘密/密钥,并且具有比密码哈希更高的访问要求。好的。好啊。


    MD5是一个加密(单向)散列函数,因此没有直接的方法来解码它。加密散列函数的全部目的是不能撤消它。

    你能做的一件事是一个蛮力策略,你猜出什么是散列的,然后用相同的函数散列它,看看它是否匹配。除非散列数据很容易猜测,否则可能需要很长时间。


    不,您不能解密/反转MD5,因为它是单向加密。但是有些网站有大量的密码数据库,所以你可以尝试在线解码你的MD5或SHA1哈希字符串。我尝试了一个类似http://www.mycodemyway.com/encrypt-and-decrypt/md5的网站,它对我来说工作得很好,但是这完全取决于你的散列值。如果散列值存储在数据库中,那么你就可以得到实际的字符串。


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