是否可以解密 MD5 哈希?

Posted

技术标签:

【中文标题】是否可以解密 MD5 哈希?【英文标题】:Is it possible to decrypt MD5 hashes? 【发布时间】:2010-12-01 02:17:23 【问题描述】:

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

    从其他系统检索 MD5 加密密码; 解密加密密码并 使用系统自己的算法将密码存储在系统的数据库中。

这可能吗?我认为解密 MD5 哈希是不可能/可行的。

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

【问题讨论】:

还原 MD5 也会产生多个密码。 MD5 是一种摘要算法。把它想象成把牛变成牛排。现在尝试扭转这种情况。 @Arst 据我了解,是的,但前提是你有很多这些。即使你这样做了,你也无法逆转,因为算法会故意丢失信息。 @mechanicalsnail 考虑到这个类比,一个人可以从牛排上的 DNA 制作一个完全完美的克隆。 :)) @TrimikhaValentius MD5 是一种消化算法。把它想象成吃牛排>消化>输出。现在尝试扭转这种情况。 【参考方案1】:

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

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

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

也就是说,已发现 MD5 存在一些弱点,例如通过一些复杂的数学运算,可能无需尝试 2128 个可能的输入字符串就可以找到冲突。而且大多数密码都很短,而且人们经常使用通用值(如“密码”或“秘密”)这一事实意味着,在某些情况下,您可以通过谷歌搜索哈希或使用 @ 来合理地猜测某人的密码987654323@。这就是为什么您应该始终使用“salt”散列密码的原因之一,以便两个相同的值在散列时不会散列到相同的值。

一旦一条数据通过哈希函数运行,就没有回头路了。

【讨论】:

然而,在 MD5 散列空间中的冲突比最初想象的要多。它不再被认为是密码的最佳哈希值。 由于大多数密码都比 MD5 哈希值短,因此每个哈希值通常只有一个密码。 (并且找到一个,即使它不是原始的,也足以访问该帐户。)作为单向函数的重点不是有多个不同的原像,所以我们无法知道哪个是原来的一个,但是真的很难找到一个原来的值 @Nick:实际上,RFC1321 明确表示:“算法将任意长度的消息作为输入” @Olathe - 我不确定我是否同意。给定一个散列,通常不可能确定(100% 确定)原始输入。 (通常)有无限数量的输入产生每个可能的(散列)输出。我说一般是因为,如果您知道(例如)您正在寻找一串 ASCII 字符,并且它小于 12 个字节,那么很可能只有一个输入产生给定的输出。但是总会有冲突(无限),除非你有一些外部约束(比如我的例子),否则你永远不会知道哪个是正确的 @Adam Batkin,你是对的,但我并不是说 100% 确定。密码破解不能 100% 确定。发件人可能使用与解密其他英文明文相同的密钥来表示随机乱码而不是英文明文,但英文的概率非常接近 100%。同样,在长 UTF-8 日文诗歌密码和乱码字符串之间进行选择时,这首诗的概率接近 100%。这可以使用事后概率而不是预先选择的约束来完成。一般情况下显然做不到,但还是蛮有用的。【参考方案2】:

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

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

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

它很快,这意味着如果您有一个“目标”散列,尝试大量密码并查看是否能找到一个散列到该目标的密码是很便宜的。加盐对 场景没有帮助,但它有助于使尝试使用不同的盐找到与 多个 哈希中的任何一个匹配的密码变得更加昂贵。 我相信它存在已知的缺陷,可以更容易地发现冲突,尽管在可打印文本(而不是任意二进制数据)中发现冲突至少会更难。

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

【讨论】:

是的,还有其他方法,但您需要了解 Jon 上面所说的内容 - “您不应该通过电子邮件向他们发送密码 - 这是可能仍然敏感的敏感信息。” - 在最低级别,可以拦截电子邮件并检索敏感信息。密码应尽可能安全——通常仅将其作为哈希值保存在数据库中。 而且如果密码可以反转,这意味着任何可以访问您的数据库的人都可以获取用户的密码。 不是一个好主意。一种方式的密码应该是规范;仅在您绝对必须时才保留真实密码(即使是加密的)(例如,向另一个没有任何基于令牌的系统进行身份验证)。 我见过反垃圾邮件措施,其中接收者网络服务器拒绝接收邮件只是为了等待发件人的邮件服务器重试(垃圾邮件机器人通常只尝试一次)。这很容易超过您的 10 分钟超时时间。 @ravisoni:这可能是通过蛮力或查找表找到具有相同哈希的 a 值。不能保证它是原始的明文值。 @ravisoni:这里的“正确”是什么意思?如果密码未知,则无法知道泄露的密码是否是原始密码。但关键是,像 MD5 根据定义这样的一种散列方式会丢失信息。像这样的网站可以提供 a 匹配密码的事实正好证明 MD5 是出于安全原因而使用的糟糕算法。【参考方案3】:

从技术上讲,这是“可能的”,但在非常严格的条件(rainbow tables,基于用户密码在该哈希中的可能性很小的情况下进行暴力破解数据库)。

但这并不意味着它是

可行 或 安全

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


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

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

需要“丢失密码”时:2 个选项:

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

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

【讨论】:

我有一些吹毛求疵。彩虹表不是暴力破解。实际上有一些程序和网站会暴力破解(非常简单)几个字符的密码(通常它们只会循环几个小时或几天,你可以填写一个哈希并希望它出现在循环中)。不幸的是,鉴于许多密码缺乏质量,弹出一个的机会并不是“一个非常小的机会”。 我必须插话:逆向 MD5 本质上不是恶意的。你如何使用这种能力是决定恶意或善意的因素。如果有人想出如何扭转它并与世界分享,他们可能会赢得诺贝尔奖或其他什么。如果这是你想做的,不要害怕尝试逆向工程。这就是我们都变得更好的方式。但如果你发现了 MD5 的逆向,然后利用它谋取私利,那么是的,你是恶意的。【参考方案4】:

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

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

【讨论】:

我要补充一点,找到另一个散列到相同输出的值称为“冲突”。这是破坏 MD5 散列系统的最常用方法。 @Renesis,查找散列到先前已知值的数据实际上被称为“原像”,它比单纯的碰撞要困难得多,很多。尚未证明针对 MD5 的原像攻击,但已经使用了碰撞攻击。 哈希函数的意义(当用于密码存储时)并不是有很多可能的密码给出相同的哈希值(有,但大多数都比哈希值本身长),但是很难找到其中一个(这足以访问系统)。是的,由于彩虹表,您不使用未加盐的哈希。而且由于密码空间小,您将使用慢速散列(如 bcrypt 或 scrypt)而不是快速散列(如 MD5/SHA-*/....) 从技术上讲,您不能确定地执行 MD5,因为硬件可能出现故障。同样,您可能无法确定密码是password,而不是所有其他产生相同哈希但看起来非常随机的无限输入,但您可以足够接近。 鸽巢原理当然适用,但仍然在计算上不可行找到第二个散列到某个值的输入,例如普通密码的哈希值。如果你发现一个 X 散列到给定的 H(X),那么你可以确定 X 是正确的输入。 这使得该答案的整个第一部分以及其余大部分都不正确。【参考方案5】:

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

通常处理这种情况的方式是“重置”密码。也就是说,您给他们一个新的(随机)密码,然后通过电子邮件发送给他们。

【讨论】:

如果哈希没有加盐,您会惊讶地发现,只需在谷歌上搜索哈希值... 不过对于密码检索系统来说并不实用,即使是未加盐的系统:)【参考方案6】:

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

但你可以:

给用户一个新的。

检查一些彩虹表,也许可以找回旧的。

【讨论】:

拒绝彩虹表的想法。如果你正在腌制——而且你应该这样做——那么无论如何它都行不通。 @StevenSudit 如果他们仍在使用 MD5 来散列密码而不是使用强密码散列,那么您不能假设他们使用的是盐。也许他们有,也许他们没有。【参考方案7】:

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

加密哈希(MD5 等)是一种方式,您无法仅使用摘要返回原始消息除非您还有其他方式有关原始消息等的信息,您不应该这样做。

【讨论】:

【参考方案8】:

解密(直接从哈希值中得到纯文本,以算法的方式),不。

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

【讨论】:

【参考方案9】:

MD5 是一种哈希算法,不能还原哈希值。

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

【讨论】:

【参考方案10】:

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

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

我不愿提及这一点,因为这是一个坏主意(无论如何也不能保证有效),但您可以尝试在milw0rm 之类的彩虹表中查找哈希,看看您是否可以通过这种方式恢复旧密码.

【讨论】:

【参考方案11】:

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

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

此外,这不适用于加盐哈希。 Salting 被许多安全专家推荐。

【讨论】:

不正确。如果找到匹配项,则可以确定它将是原始密码。如果不是这种情况,那么给定任何 H(X) 都可能产生冲突,其中 X 是一条没有由对手确定的预定义结构的消息。为密码安全的哈希函数找到这样的冲突在计算上是不可行的,即使它是一个损坏的哈希函数,例如 MD5。 @MaartenBodewes:“如果找到匹配项,则可以确定它将是原始密码。”如果我们假设密码长度不受限制,我看不出情况如何。我会说它极有可能是原始密码,但它不是必须。事实上,可能的密码比 MD5 哈希值多,这意味着必须可能有两个密码具有相同的哈希值。仅仅因为在计算上无法找到这样的碰撞并不意味着它们不存在。还是我误会了你? @JonSkeet 如果故意在计算上不可行,那么偶然找到一个碰撞同样不可能或更糟。由于 MD5 的有限输出空间和生日问题,您发现碰撞的机会大约是 2^64 分之一(即大约输出空间的一半) - 这是在匹配大约 2^64 个哈希之后。这甚至不考虑消息可能需要很小并且具有特定格式才能被视为密码。大多数密码的熵远低于 2^64 位。 @MaartenBodewes:但“天文数字上不太可能”和“不可能”之间存在很大差异。 IMO,您关于它确定是正确密码的声明过于强大。这表明了一种不存在的数学确定性。 您也可以一口气猜出一个 2^128 位的 AES 密钥。这“只是”极不可能。密码学依赖于这种可能性。出于所有实际目的,如果您找到输入消息/密码,它将是您正在寻找的那个。 理论上可能 找到另一个输入消息很好,但是对于这个问题 on *** 没有必要考虑它。彩虹表只填满了可能的密码。它们不会包含足够的数据,甚至没有发生碰撞的可能性(它们要么会在不知不觉中覆盖映射,要么会出名)。【参考方案12】:

MD5 被认为是损坏的,不是因为您可以从散列中取回原始内容,而是因为通过工作,您可以制作两条散列到相同散列的消息。

您不能取消散列 MD5 散列。

【讨论】:

按照设计,所有相同长度的哈希都会发生冲突。限制变长数据时不可避免。 MD5 被认为是过时的碰撞率,而不是碰撞的事实。 MD5 被认为是损坏的,因为已证明有可能构造碰撞的输入。【参考方案13】:

就找到它的反函数而言,没有办法“还原”散列函数。如前所述,这是拥有哈希函数的全部意义所在。它不应该是可逆的,它应该允许快速哈希值计算。因此,找到产生给定哈希值的输入字符串的唯一方法是尝试所有可能的组合。因此,这被称为暴力攻击。

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

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

【讨论】:

这个答案没有什么问题,只是散列函数的速度是个很大的问题,因为大多数密码不够安全,并且允许攻击者执行字典攻击。出于这个原因,使用慢速密码散列函数而不是快速加密安全散列函数。【参考方案14】:

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

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

如果使用 SALT 消息对消息进行哈希处理 如果消息被多次散列

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

【讨论】:

Rainbow 表 - 不是字典攻击 - 如果使用盐则毫无用处。多次散列 - 没有盐 - 仍然允许彩虹表,尽管在网上找到一个预先存在的的可能性肯定较小。【参考方案15】:

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

解密不是为散列函数定义的函数;加密和解密是 cipher 的函数,例如 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 可以重新计算并比较结果。换句话说,不需要将哈希值解密以仅验证密码是否正确,您仍然可以将哈希值存储为不同的值。 p>


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

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

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

常用的密码哈希是 bcryptscryptPBKDF2。还有各种形式的 Argon2,它是近期密码哈希竞赛的获胜者。 Here on CrackStation 是一篇关于密码安全的好博文。


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

【讨论】:

【参考方案16】:

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

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

【讨论】:

【参考方案17】:

是的,您所要求的正是可能的。 没有帮助是不可能“解密”一个 MD5 密码的,但是可以将一个 MD5 密码重新加密成另一种算法,而不是一次性完成。

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

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

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

【讨论】:

感谢您的回复。但是我要“1 up”你:)我不记得我是否真的这样做了,但理论上它应该可以工作。无需等待每个用户登录以便我们重新加密他们的密码,您可以简单地加密他们密码的散列版本。所以每个密码都会被 MD5 散列,然后加密。刚刚更新了密码检查以执行相同的操作,并且用户数据应该是安全的,无需用户干预。 对我上面的评论还有一个警告。我不是加密专家,所以我不确定这是否有任何进一步的安全隐患。例如,在加密之前加密弱散列的弱密码可能会危及加密的安全性(也许也使用另一种盐?)。此外,您可能会使用这些 MD5 散列密码进行备份。在进行此类升级时,最好使所有现有密码完全失效。 密码学家担心双重加密,但我认为他们只发现了一些微不足道的问题。但我认为在这种情况下它没有用,因为 MD5 对于(不太长的文本)密码仍然是安全的。尽管如此,如果以前的开发人员忘记添加盐,双重哈希可能会很有用,否则,我想不出你不必告诉所有人密码应该被认为是 pwned 的情况。希望您的备份不会丢失,并且无论如何都已加密。【参考方案18】:

不,不能这样做。您可以使用字典,也可以尝试散列不同的值,直到获得所需的散列。但不能“解密”。

【讨论】:

我看到这个网站将 md5 反转为原始文本:md5.gromweb.com。那怎么可能呢? @samach321 - 简单:他们有一个散列字符串数据库。您在他们的“将字符串转换为 MD5 哈希”框中输入的任何内容都会添加到数据库中。尝试从另一个来源获取 MD5 哈希并输入它。除非它是在他们的数据库中的东西,否则你不会得到结果。 它被称为彩虹桌,顺便说一句。来自***:“彩虹表是一个预先计算好的表,用于缓存加密哈希函数的输出,通常用于破解密码哈希。” @JordanArseno - 我知道。对于这项任务,它是一种高效的数据结构,但归根结底,它仍然只是一种(非常具体的)数据库。【参考方案19】:

MD5 有它的弱点(参见Wikipedia),所以有些项目会尝试预先计算哈希值。***也暗示了其中一些项目。我知道(和尊重)的一个是 ophrack。你不能告诉用户他们自己的密码,但你可以告诉他们一个有效的密码。但我认为:只需邮寄一个新密码,以防他们忘记。

【讨论】:

MD5 被破坏的事实(对于函数的特定但重要的用途)与彩虹表完全无关(这是你在提到预计算时暗示的哈希)。【参考方案20】:

MD5 Hash算法不可逆,无法进行MD5解码,但有些网站有批量密码匹配,可以在线尝试解码MD5哈希。

在线尝试:

MD5 Decrypt

md5online

md5decrypter

【讨论】:

是的,但这已经被问题所涵盖,如“我知道有字典”这句话。因此,仅仅指出字典并不能算作答案。【参考方案21】:

理论上不可能解密散列值,但是您有一些肮脏的技术可以取回原始纯文本。

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

【讨论】:

字典攻击是另一种方式,或者与您知道输入密码的其他数据库进行比较。【参考方案22】:

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

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

【讨论】:

【参考方案23】:

目前还不可能将密码的散列放入算法并以纯文本形式取回密码,因为散列是单向的。但是人们所做的是生成散列并将其存储在一个大表中,这样当您输入特定的散列时,它会检查表中与散列匹配的密码并将该密码返回给您。 http://www.md5online.org/ 就是一个这样的网站示例。现代密码存储系统通过使用加盐算法来应对这种情况,这样当您在注册过程中将相同的密码输入密码框时,会生成不同的哈希值。

【讨论】:

【参考方案24】:

不,您不能解密/反转 md5,因为它是一种单向哈希函数,直到您在 MD5 中找不到广泛的漏洞。 另一种方法是有些网站有大量的密码数据库,所以你可以尝试在线解码你的 MD5 或 SHA1 哈希字符串。 我尝试了website 之类的http://www.mycodemyway.com/encrypt-and-decrypt/md5,它对我来说工作正常,但这完全取决于您的哈希值,如果该哈希值存储在该数据库中,那么您可以获得实际的字符串。

【讨论】:

不,MD5 不是加密,甚至不是单向加密(一开始就没有意义)。

以上是关于是否可以解密 MD5 哈希?的主要内容,如果未能解决你的问题,请参考以下文章

md5为啥不能解密?

加密和解密md5

C#开发中常用加密解密方法解析

crypto基于crypto.js的web前端加解密系统实现

java密码加密与解密

MD5+DES在C#.NET与Java/Android中的加解密使用