有人告诉我,他看到过以下软件系统:
- 从其他系统检索MD5加密的密码;
- 解密加密的密码并
- 使用系统自己的算法将密码存储在系统的数据库中。
那可能吗?我认为解密MD5散列是不可能/不可行的。
我知道有MD5词典,但是有实际的解密算法吗?
有人告诉我,他看到过以下软件系统:
那可能吗?我认为解密MD5散列是不可能/不可行的。
我知道有MD5词典,但是有实际的解密算法吗?
Answers:
不能。MD5不是加密(尽管它可以用作某些加密算法的一部分),但它是一种单向哈希函数。实际上,许多原始数据在转换过程中实际上是“丢失”的。
考虑一下:MD5始终为128位长。这意味着有2 128个可能的MD5哈希。这是一个相当大的数字,但绝对是有限的。但是,给定散列函数有无限数量的可能输入(其中大多数包含超过128位,或仅16个字节)。因此,对于散列为相同值的数据来说,实际上存在无限数量的可能性。使哈希变得有趣的是,很难找到两个哈希值相同的数据,而且偶然发生的几率几乎为零。
一个(非常不安全的)哈希函数的简单示例(这说明了它是单向的),就是将一条数据的所有位都当作一个大数对待。接下来,使用一些大的(可能是素数)n执行整数除法,然后取余数(请参阅:模数)。您将剩下0到n之间的某个数字。如果您要使用完全相同的字符串再次(在任何时间,在任何计算机上,任何地方)再次执行相同的计算,它将得出相同的值。然而,有没有办法找出原来的值,因为有一些有确切的数字剩余,当除以无限数量的ñ。
也就是说,已经发现MD5有一些弱点,以至于通过一些复杂的数学运算,无需尝试2128个可能的输入字符串就可以找到冲突。而且大多数密码都很短,而且人们经常使用通用值(例如“ password”或“ secret”),这意味着在某些情况下,您可以通过谷歌搜索哈希或使用Rainbow来合理地猜测某人的密码表。这就是为什么您应始终“ 加盐 ”散列密码的原因之一,以便使两个相同的值在散列时不会散列为相同的值。
一旦通过散列函数运行了一条数据,便无法返回。
从理论上讲,你不能。哈希的全部意义在于,它只是一种方式。这意味着,如果有人设法获取哈希列表,那么他们仍然无法获取您的密码。此外,这意味着即使有人在多个站点上使用相同的密码(是的,我们都知道不应该,但是...)有权访问站点A的数据库的任何人都将无法在该站点上使用用户的密码。网站B。
MD5是散列的事实也意味着它会丢失信息。对于任何给定的MD5哈希,如果允许任意长度的密码,则可能会有多个密码产生相同的哈希。对于一个好的哈希,要在一个很小的最大长度范围内找到它们,在计算上是不可行的,但这意味着无法保证,如果您找到具有目标哈希的密码,那肯定是原始密码。从天文学角度来看,您不可能看到两个具有相同MD5哈希值的仅ASCII,合理长度的密码,但这并非不可能。
MD5是用于密码的错误哈希:
我不是安全专家,因此除了“不要推出自己的身份验证系统”之外,不会提出具体建议。从信誉良好的供应商那里找到一个,然后使用它。安全系统的设计和实施都是一项艰巨的任务。
从技术上讲,它是“可能的”,但是在非常严格的条件下(彩虹表,基于用户密码在该哈希数据库中的可能性很小的暴力破解)。
但这并不意味着
您不想“反向” MD5哈希。使用下面概述的方法,您将永远不需要。“反向” MD5实际上被认为是恶意的 -一些网站提供了“破解”和蛮力MD5哈希的功能-但是它们都是庞大的数据库,其中包含字典词,先前提交的密码和其他词。有一个非常小的机会,这将有你需要扭转的MD5哈希值。如果你已经腌制的MD5哈希-这将不能工作!:)
使用MD5哈希登录的方式应该是:
注册期间:
用户创建密码->使用MD5哈希密码->存储在数据库中的哈希
登录期间:
用户输入用户名和密码->(已检查用户名)使用MD5对密码进行哈希处理->将哈希与数据库中存储的哈希进行比较
需要“丢失密码”时:
2个选项:
要么
不直接。由于信鸽原理,对任何给定的MD5输出有(可能)多个哈希值。因此,您无法确定地将其撤消。而且,使用MD5很难找到任何这样的反向哈希(但是,曾经发生过会产生冲突的攻击-也就是说,生成的两个值会哈希到相同的结果,但是您无法控制得到的MD5值将是什么是)。
但是,如果将搜索空间限制为例如长度小于N的普通密码,则可能不再具有不可逆性属性(因为MD5输出的数量远大于目标域中的字符串数量)。然后,您可以使用彩虹表或类似表来反向散列。
password
而不是所有其他产生相同散列但看起来非常随机的无限输入,但您可以保证足够接近。
不可能,至少没有在合理的时间内。
经常处理此问题的方式是密码“重置”。也就是说,您给他们一个新的(随机)密码并通过电子邮件发送给他们。
您无法还原md5密码。(任何语言)
但是你可以:
给用户一个新的。
检查一些彩虹表,也许找回旧的。
解密(以算法方式直接从散列值获取纯文本),否。
但是,有些方法使用所谓的Rainbow table。如果您的密码是不加盐的哈希,这是非常可行的。
MD5是一种哈希算法,无法还原哈希值。
您应该添加“更改密码功能”,其中用户提供另一个密码,计算哈希并将其存储为新密码。
在这里查看所有其他答案,以了解如何以及为什么它不可逆以及为什么您无论如何都不想。
为了完整起见,有彩虹表,您可以在上面查找可能的匹配项。不能保证彩虹表中的答案将是您的用户选择的原始密码,这样会使他们大为困惑。
同样,这对于盐渍哈希也不起作用。许多安全专家建议加盐。
就找到散列函数的逆函数而言,无法“还原”散列函数。如前所述,这是具有哈希函数的全部要点。它不应是可逆的,并且应允许快速计算哈希值。因此,查找产生给定哈希值的输入字符串的唯一方法是尝试所有可能的组合。因此,这称为蛮力攻击。
尝试所有可能的组合会花费大量时间,这也是为什么使用哈希值以相对安全的方式存储密码的原因。如果攻击者能够使用内部的所有用户密码访问您的数据库,则无论如何您都会松懈。如果您具有哈希值和(从理论上来说)强密码,那么从攻击者的哈希值中获取密码将变得更加困难。
存储散列值也不会有性能问题,因为计算散列值相对较快。因此,大多数系统要做的是计算用户键入的密码的哈希值(快速),然后将其与用户数据库中存储的哈希值进行比较。
MD5被认为是损坏的,不是因为您可以从哈希中获取原始内容,而是因为在工作中,您可以将两条哈希为同一哈希的消息。
您不能取消哈希MD5哈希。
是的,您所要求的完全可能。在没有帮助的情况下无法“解密” MD5密码,但是有可能将MD5密码重新加密为另一种算法,只是不能一次完成。
您要做的是安排用户使用旧的MD5密码登录到新系统。在他们登录时,他们为您的登录程序提供了一个未加密的密码版本,您证明该密码与您拥有的MD5哈希匹配。然后,您可以将此未哈希的密码转换为新的哈希算法。
显然,这是一个扩展过程,因为您必须等待用户告诉您密码是什么,但它确实起作用。
(注:七年后,希望有人会发现它有用)
不,这无法完成。您既可以使用字典,也可以尝试对不同的值进行哈希处理,直到获得所需的哈希值为止。但是它不能被“解密”。
MD5有其弱点(请参阅Wikipedia),因此有些项目试图预计算哈希值。维基百科也暗示了其中一些项目。我知道(和尊重)的一个是反抗。您不能告诉用户他们自己的密码,但是您可以告诉他们有效的密码。但是我认为:只要给他们发送新密码以防万一他们忘记了。
不,不可能反转诸如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(基于密码的密钥派生功能)。这样的函数指定如何将盐与哈希一起使用。这样,就不会为相同的密码(从其他用户或在其他数据库中)生成相同的哈希。由于这个原因,密码哈希也不允许使用彩虹表,只要盐足够大且可以适当地随机分配。
密码哈希还包含一个工作因子(有时使用迭代计数进行配置),可以显着减慢尝试在给定salt和hash值的情况下查找密码的攻击。这很重要,因为带有盐和哈希值的数据库可能会被盗。最后,密码哈希也可能难以存储,因此需要大量内存来计算哈希。这使得不可能使用特殊的硬件(GPU,ASIC,FPGA等)来使攻击者加快搜索速度。其他输入或配置选项(例如Pepper或并行化量)也可用于密码哈希。
但是,H(X)
即使H(X)
是密码哈希,它仍然允许任何人验证给出的密码。密码哈希仍然是确定性的,因此,如果有人知道所有输入,并且X
可以使用哈希算法本身进行计算,H(X)
并且可以再次比较结果。
常用的密码哈希是bcrypt,scrypt和PBKDF2。还有各种形式的Argon2,它是最近相当合理的密码哈希竞赛的获胜者。在CrackStation上,这是一篇有关做好密码安全性的不错的博客文章。
可能使对手无法执行哈希计算,以验证密码是否正确。为此,可以将Pepper用作密码哈希的输入。或者,当然可以使用诸如AES之类的密码和诸如CBC或GCM之类的操作模式来加密散列值。但是,这需要独立存储秘密/密钥,并且具有比密码哈希更高的访问要求。
MD5是一种加密(单向)哈希函数,因此没有直接的方法对其进行解码。加密哈希函数的全部目的是您不能撤消它。
您可以做的一件事是蛮力策略,您可以在其中猜测要进行哈希处理的内容,然后使用相同的函数对其进行哈希处理,看看是否匹配。除非很容易猜测散列数据,否则可能要花很长时间。
由于散列是一种方式,因此尚不可能将密码的散列放入算法中并以纯文本形式取回密码。但是人们所做的就是生成哈希并将其存储在一个大表中,这样当您输入特定的哈希时,它将检查表中是否有与哈希匹配的密码并将该密码返回给您。http://www.md5online.org/就是这样做的网站示例 。现代的密码存储系统通过使用一种加盐算法来对此进行反击,以便在注册期间在密码框中输入相同的密码时,会生成不同的哈希。
不,您不能解密/反向md5,因为它是一种单向哈希函数,直到您在MD5中找不到广泛的漏洞为止。另一种方法是,有些网站拥有大量的密码数据库集,因此您可以尝试在线解码MD5或SHA1哈希字符串。我尝试了一个像http://www.mycodemyway.com/encrypt-and-decrypt/md5的网站,它对我来说很好用,但这完全取决于您的哈希,如果该哈希存储在该数据库中,则可以获取实际的字符串。