有人告诉我,他见过这样的软件系统:
从其他系统检索 MD5 加密密码;解密加密的密码并使用系统自己的算法将密码存储在系统的数据库中。
那可能吗?我认为解密 MD5 哈希是不可能/可行的。
我知道有 MD5 字典,但有实际的解密算法吗?
不。MD5 不是加密(尽管它可能被用作某些加密算法的一部分),它是一种单向hash function。作为转换的一部分,许多原始数据实际上“丢失”了。
想一想:MD5 总是 128 位长。这意味着有 2128 个可能的 MD5 哈希值。这是一个相当大的数字,但它绝对是有限的。然而,一个给定的散列函数有无限多的可能输入(其中大多数包含超过 128 位,或区区 16 个字节)。因此,实际上有无数种可能的数据会散列到相同的值。让哈希变得有趣的是,要找到两个哈希值相同的数据非常困难,而且偶然发生的可能性几乎为 0。
(非常不安全的)哈希函数的一个简单示例(这说明了它是单向的一般概念)是获取一段数据的所有位,并将其视为一个大数。接下来,使用一些大(可能是素数)数 n 执行整数除法并取余数(参见:Modulus)。您将留下一些介于 0 和 n 之间的数字。如果您要再次执行相同的计算(任何时间、任何计算机、任何地方),使用完全相同的字符串,它将得出相同的值。然而,没有办法找出原始值是多少,因为有无数的数字在除以 n 时具有精确的余数。
也就是说,已发现 MD5 有一些弱点,例如通过一些复杂的数学运算,可能无需尝试 2128 个可能的输入字符串就可以找到冲突。而且大多数密码都很短,而且人们经常使用通用值(如“密码”或“秘密”)这一事实意味着,在某些情况下,您可以通过谷歌搜索哈希值或使用 { 1}。这就是为什么您应该始终使用“salt”散列密码的原因之一,以便两个相同的值在散列时不会散列到相同的值。
一旦一条数据通过哈希函数运行,就没有回头路了。
你不能——理论上。哈希的全部意义在于它只是一种方式。这意味着如果有人设法获得哈希列表,他们仍然无法获得您的密码。此外,这意味着即使有人在多个站点上使用相同的密码(是的,我们都知道我们不应该,但是......)任何有权访问站点 A 数据库的人都将无法在站点 B。
MD5 是哈希的事实也意味着它会丢失信息。对于任何给定的 MD5 哈希,如果您允许任意长度的密码,则可能有多个密码产生相同的哈希。对于一个好的散列,在一个非常微不足道的最大长度之外找到它们在计算上是不可行的,但这意味着如果你找到一个具有目标散列的密码,它肯定是原始密码。从天文数字上看,您不太可能看到两个具有相同 MD5 哈希的纯 ASCII、合理长度的密码,但这并非不可能。
MD5 是用于密码的错误哈希:
它很快,这意味着如果你有一个“目标”散列,尝试大量密码并查看是否能找到一个散列到该目标的密码是很便宜的。加盐对这种情况没有帮助,但它有助于使尝试找到与使用不同盐的多个哈希中的任何一个匹配的密码变得更加昂贵。
我相信它有已知的缺陷,可以更容易地找到冲突,尽管在可打印文本(而不是任意二进制数据)中找到冲突至少会更难。
我不是安全专家,所以除了“不要推出自己的身份验证系统”之外,我不会提出具体的建议。从信誉良好的供应商那里找到一个,然后使用它。安全系统的设计和实施都是一项棘手的工作。
从技术上讲,这是“可能的”,但在非常严格的条件(rainbow tables,基于用户密码在该哈希数据库中的可能性很小的情况下进行暴力破解)。
但这并不意味着它
可行或
安全的
您不想“反转”一个 MD5 哈希。使用下面概述的方法,您永远不需要这样做。 “反转” MD5 实际上被认为是恶意 - 一些网站提供“破解”和暴力破解 MD5 哈希的能力 - 但它们都是包含字典单词、先前提交的密码和其他单词的大型数据库。有一个非常小的机会,它将具有您需要反转的 MD5 哈希。 如果您有 salted MD5 哈希 - 这也不起作用! :)
使用 MD5 哈希登录的方式应该是: 注册期间:用户创建密码 -> 密码使用 MD5 哈希 -> 哈希存储在数据库中
登录期间:用户输入用户名和密码 ->(检查用户名)使用 MD5 对密码进行哈希处理 -> 将哈希值与数据库中存储的哈希值进行比较
当需要“丢失密码”时:2 个选项:
用户发送了一个随机密码来登录,然后在第一次登录时被窃听更改密码。
或者
向用户发送一个链接以更改其密码(如果您有安全问题/等额外检查),然后新密码被散列并替换为数据库中的旧密码
不是直接的。由于 pigeonhole principle,有(可能)不止一个值散列到任何给定的 MD5 输出。因此,您无法确定地扭转它。此外,MD5 使得很难找到任何这样的反向哈希(但是已经有产生 collisions 的攻击 - 即产生两个哈希到相同结果的值,但你可以'不控制生成的 MD5 值是什么)。
但是,如果将搜索空间限制为例如长度小于 N 的常见密码,则可能不再具有不可逆性(因为 MD5 输出的数量远大于感兴趣域中的字符串数量)。然后您可以使用 rainbow table 或类似的反向哈希。
password
,而不是所有其他产生相同哈希但看起来非常随机的无限输入,但您可以足够接近。
不可能,至少在合理的时间内不可能。
通常处理这种情况的方式是密码“重置”。也就是说,您给他们一个新的(随机)密码并通过电子邮件发送给他们。
您无法恢复 md5 密码。(任何语言)
但是你可以:
给用户一个新的。
检查一些彩虹表,也许可以找回旧的。
不,他一定是对 MD5 字典感到困惑。
加密哈希(MD5 等)是一种方法,除非您有一些关于原始消息等的其他信息,否则您无法仅使用摘要返回原始消息。
MD5 是一种散列算法,不能还原散列值。
您应该添加“更改密码功能”,用户提供另一个密码,计算哈希并将其存储为新密码。
没有简单的方法可以做到这一点。这是首先对密码进行哈希处理的一种方式。 :)
您应该能够做的一件事是手动为他们设置一个临时密码并将其发送给他们。
我不愿提及这一点,因为这是一个坏主意(无论如何也不能保证有效),但您可以尝试在 milw0rm 之类的彩虹表中查找哈希,看看是否可以通过这种方式恢复旧密码。
在此处查看所有其他答案,了解它如何以及为什么不可逆以及为什么您无论如何都不想这样做。
不过,为了完整起见,您可以在 rainbow tables 上查找可能的匹配项。无法保证彩虹表中的答案将是您的用户选择的原始密码,这会使他们非常困惑。
此外,这不适用于盐渍哈希。 Salting 是许多安全专家推荐的。
MD5 被认为是损坏的,不是因为您可以从散列中取回原始内容,而是因为通过工作,您可以制作两条散列到相同散列的消息。
您不能取消散列 MD5 散列。
就找到它的反函数而言,没有办法“恢复”散列函数。如前所述,这是拥有哈希函数的全部意义所在。它不应该是可逆的,它应该允许快速哈希值计算。因此,找到产生给定哈希值的输入字符串的唯一方法是尝试所有可能的组合。出于这个原因,这被称为蛮力攻击。
尝试所有可能的组合需要花费大量时间,这也是使用哈希值以相对安全的方式存储密码的原因。如果攻击者能够使用其中的所有用户密码访问您的数据库,那么您无论如何都会松懈。如果您有散列值和(理想情况下)强密码,那么攻击者就很难从散列值中获取密码。
存储散列值也没有性能问题,因为计算散列值相对较快。因此,大多数系统所做的是计算用户键入的密码的哈希值(速度很快),然后将其与用户数据库中存储的哈希值进行比较。
不,不可能反转诸如 MD5 之类的散列函数:给定输出散列值,除非知道有关输入消息的足够信息,否则不可能找到输入消息。
解密不是为散列函数定义的函数;加密和解密是密码的功能,例如 CBC 模式下的 AES;散列函数不加密也不解密。散列函数用于消化输入消息。顾名思义,设计上不可能有反向算法。
MD5 被设计为一种加密安全的单向哈希函数。现在很容易为 MD5 生成冲突 - 即使输入消息的大部分是预先确定的。因此 MD5 被正式破解,MD5 不应再被视为加密安全哈希。然而,仍然不可能找到导致哈希值的输入消息:当仅知道 H(X) 时找到 X(并且 X 没有具有至少一个 128 字节的预计算数据块的预计算结构) .没有已知的针对 MD5 的前映像攻击。
通常也可以使用蛮力或(增强的)字典攻击来猜测密码,比较数据库或尝试在所谓的彩虹表中找到密码哈希。如果找到匹配项,则在计算上可以确定输入已找到。散列函数对于碰撞攻击也是安全的:找到 X'
使得 H(X') = H(X)
给定 H(X)
。因此,如果找到 X
,则在计算上可以确定它确实是输入消息。否则你毕竟会执行碰撞攻击。彩虹表可用于加速攻击,并且有专门的互联网资源可以帮助您找到给定特定哈希的密码。
当然可以重新使用散列值 H(X)
来验证在其他系统上生成的密码。接收系统唯一需要做的就是存储将 H(X)
作为输入的确定性函数 F
的结果。当 X
提供给系统时,可以重新计算 H(X)
和 F
并比较结果。换句话说,不需要解密散列值以仅验证密码正确,您仍然可以将散列存储为不同的值。
使用密码散列或 PBKDF(基于密码的密钥派生函数)代替 MD5 很重要。这样的函数指定如何将盐与哈希一起使用。这样就不会为相同的密码(来自其他用户或其他数据库)生成相同的哈希值。出于这个原因,密码哈希也不允许使用彩虹表,只要盐足够大并且适当地随机化。
密码哈希还包含一个工作因素(有时使用迭代计数进行配置),它可以显着减慢试图找到给定盐和哈希值的密码的攻击。这很重要,因为带有盐和哈希值的数据库可能会被盗。最后,密码散列也可能是内存硬的,因此需要大量内存来计算散列。这使得攻击者无法使用特殊硬件(GPU、ASIC、FPGA 等)来加快搜索速度。其他输入或配置选项(例如辣椒或并行化量)也可用于密码哈希。
但是,即使 H(X)
是密码哈希,它仍然允许任何人验证给定 H(X)
的密码。密码哈希仍然是确定性的,所以如果有人知道所有输入和哈希算法本身,那么 X
可以用来计算 H(X)
并且 - 再次 - 可以比较结果。
常用的密码哈希是 bcrypt、scrypt 和 PBKDF2。还有各种形式的 Argon2,它是近期密码哈希竞赛的获胜者。 Here on CrackStation 是一篇关于正确设置密码安全的好博文。
有可能使攻击者无法执行哈希计算来验证密码是否正确。为此,胡椒可以用作密码哈希的输入。或者,哈希值当然可以使用诸如 AES 的密码和诸如 CBC 或 GCM 的操作模式进行加密。然而,这需要独立存储密钥/密钥,并且访问要求高于密码哈希。
您可以找到使用字典检索原始消息的在线工具。
在某些情况下,字典方法可能毫无用处:
如果使用 SALT 消息对消息进行哈希处理
如果消息不止一次被散列
例如,这里有一个 MD5 decrypter 在线工具。
唯一可以工作的是(如果我们提到密码只是散列,没有添加任何盐来防止重放攻击,如果是这样你必须知道盐)顺便说一句,获取字典攻击工具,许多单词,数字等的文件然后创建两行,一行是单词,数字(在字典中)另一行是单词的哈希,如果匹配,则比较哈希...
这是唯一的方法,无需进行密码分析。
MD5 Hash算法是不可逆的,所以MD5解码是不可能的,但是有些网站有大量的密码匹配,所以你可以尝试在线解码MD5哈希。
在线尝试:
是的,您所要求的正是可能的。没有帮助是不可能“解密”一个 MD5 密码的,但是可以将一个 MD5 密码重新加密为另一种算法,但不是一次性完成的。
您所做的是安排您的用户能够使用旧的 MD5 密码登录到您的新系统。在他们登录时,他们已经为您的登录程序提供了一个未经哈希的密码版本,您证明该密码与您拥有的 MD5 哈希值相匹配。然后,您可以将此未散列的密码转换为新的散列算法。
显然,这是一个扩展过程,因为您必须等待用户告诉您密码是什么,但它确实有效。
(注意:七年后,哦,希望有人会发现它有用)
不,不能这样做。您可以使用字典,也可以尝试散列不同的值,直到获得所需的散列。但它不能被“解密”。
MD5 有它的弱点(参见Wikipedia),因此有一些项目尝试预先计算哈希。维基百科也暗示了其中一些项目。我知道(和尊重)的一个是 ophrack。你不能告诉用户他们自己的密码,但你可以告诉他们一个有效的密码。但我认为:只需邮寄一个新密码,以防他们忘记。
从理论上讲,不可能解密哈希值,但是您有一些肮脏的技术可以取回原始纯文本。
暴力破解:所有计算机安全算法都会遭受暴力破解。基于这个想法,今天的 GPU 采用了并行编程的想法,它可以通过使用任何图形处理器对纯文本进行大规模暴力破解来取回纯文本。这个工具 hashcat 完成了这项工作。上次我检查它的 cuda 版本时,我能够在 6 分钟内暴力破解一个 7 个字母长的字符。互联网搜索:只需将哈希复制并粘贴到谷歌上,看看是否可以在那里找到相应的明文。当您对某些东西进行渗透测试时,这不是一个解决方案,但绝对值得一试。一些网站维护字典中几乎所有单词的哈希值。
MD5 是一种加密(单向)散列函数,因此没有直接的方法对其进行解码。加密哈希函数的全部目的是您无法撤消它。
您可以做的一件事是蛮力策略,您可以在其中猜测散列的内容,然后使用相同的函数对其进行散列并查看它是否匹配。除非散列数据很容易猜到,否则可能需要很长时间。
尚不可能将密码的散列放入算法中并以纯文本形式取回密码,因为散列是单向的。但是人们所做的是生成散列并将其存储在一个大表中,这样当您输入特定的散列时,它会检查表中与散列匹配的密码并将该密码返回给您。执行此操作的网站示例是 http://www.md5online.org/ 。现代密码存储系统通过使用加盐算法来解决这个问题,这样当您在注册过程中将相同的密码输入密码框时,会生成不同的哈希值。
不,您无法解密/反转 md5,因为它是一种单向哈希函数,直到您无法在 MD5 中找到广泛的漏洞。另一种方法是有些网站有大量的密码数据库,所以你可以尝试在线解码你的MD5或SHA1哈希字符串。我尝试了像 http://www.mycodemyway.com/encrypt-and-decrypt/md5 这样的 website,它对我来说工作正常,但这完全取决于您的哈希值,如果该哈希值存储在该数据库中,那么您可以获得实际的字符串。