有人告诉我他看到过软件系统:
从其他系统检索MD5加密密码;
解密加密的密码和
使用系统自己的算法将密码存储在系统的数据库中。
有可能吗?我认为解密MD5哈希是不可能/不可行的。
我知道有MD5字典,但有实际的解密算法吗?
- 不,正如您所说,有字典,但无法解密MD5
- 下面是一些关于MD5碰撞的文章,这里是一个由Patrick Stach在代码板上创建的MD5碰撞生成器,基于王晓云和余洪波的论文:如何打破MD5和其他散列函数,这里是对[An MD5 Co.
- MD5是单向哈希函数。对不起的!
- 恢复MD5也会产生多个密码。
- 但是,MD5冲突与密码存储并不真正相关。
- 相关:stackoverflow.com/questions/2717950/…
- MD5是一种摘要算法。把它看成是把牛变成牛排。现在试着扭转它。
- 我想知道,如果我知道hash之前的原始值,比如abcdefg,我也知道hash之后的值,并添加一个盐,例如ffea56e6f4(例如..)。有没有可能找出散列算法?
- @据我所知,是的,但前提是你有很多。即使你这样做了,你也无法逆转,因为算法故意丢失信息。
- @机械蜗牛通过这种类比,可以从牛排的DNA中完全克隆出一个完美的克隆体。:)
- @Trimikhavalentius MD5是一种消化算法。把它看成是吃牛排>消化>产出。现在试着扭转它。
不,MD5不是加密(尽管它可能被用作某些加密算法的一部分),它是单向哈希函数。作为转换的一部分,许多原始数据实际上是"丢失"的。
考虑一下:MD5总是128位长。这意味着有2128个可能的MD5哈希。这是一个相当大的数字,但它绝对是有限的。然而,对于一个给定的散列函数,可能有无限多的输入(其中大多数包含超过128位,或者只有16个字节)。因此,对于将散列到相同值的数据,实际上有无限多的可能性。让哈希有趣的是,要找到两个哈希值相同的数据是非常困难的,而且偶然发生的概率几乎为0。
对于一个(非常不安全的)哈希函数(这说明了它是单向的)的一个简单示例是获取一段数据的所有位,并将其视为一个大数字。接下来,使用一些大的(可能是质数)数n执行整数除法,并取余数(请参见:模数)。您将得到一个介于0和N之间的数字。如果您要使用完全相同的字符串再次执行相同的计算(任何时间、任何计算机、任何位置),它将得到相同的值。然而,还没有办法知道原始值是什么,因为当除以n时,有无限多的数字具有精确的余数。
也就是说,MD5已经被发现有一些弱点,例如,在一些复杂的数学中,可以在不尝试2128个可能的输入字符串的情况下找到冲突。事实上,大多数密码都很短,人们经常使用公共值(如"密码"或"秘密"),这意味着在某些情况下,你可以通过谷歌搜索哈希或使用彩虹表来合理地猜测某人的密码。这就是为什么您应该总是"salt"散列密码的原因之一,这样当散列时,两个相同的值就不会散列到相同的值。
一旦一段数据通过散列函数运行,就不会返回。
- 但是,在MD5哈希空间中存在比最初想象的更多的冲突。它不再被认为是密码的最佳哈希。
- 这就是为什么NIST正在进行一场竞争,以确定沙-1和沙-2算法的替代方案,所有这些算法都比MD5更安全。MD5不应用于新的安全关键应用程序。尚不清楚沙一号是否安全。建议在提供SHA-3之前使用SHA-2。
- 由于大多数密码比MD5哈希短,因此每个哈希通常只有一个密码。(找到一个,即使不是原始的,也足以访问帐户。)单向功能的意义在于没有多个不同的预映像,所以我们不知道哪个是原始的,但即使是一个原始值也很难找到。
- MD5的输入数量不是无限的-输入消息限制为2^64位。
- @尼克:实际上,rfc1321明确地说:"算法把任意长度的消息作为输入。"
- 哎呀,你说得对-"B的64位表示法(在添加填充位之前消息的长度)被附加到上一步的结果中。如果b大于2^64的可能性不大,则仅使用b的低阶64位"。这里也有点轻描淡写。
- 这个答案实际上部分是错误的。虽然password和CPfvwl#qr*w4*96C@&@xj$T2ZggJC%以及无限多的其他输入可能会产生相同的散列值,但我们并没有留下如答案所示的计算原始值的零方法。这种显而易见的测试(并且,为了实现自动化,测试一个候选明文是否与预期明文的统计数据相匹配)一直被用于确定常规密文是否已经被破解。
- @奥拉亚-我不确定我是否同意。对于散列,通常无法确定(100%确定)原始输入。有(通常)无限数量的输入产生每一个可能的(散列)输出。我说一般是因为,如果你知道(例如)你在寻找一个ASCII字符串,它小于,比如说,12字节,那么很可能只有一个输入产生给定的输出。但总会有碰撞(无穷大),除非你有一些外部约束(如我的例子中),否则你永远不会知道哪一个是正确的。
- @亚当·巴金,你是对的,但我不是说100%肯定。密码破解不能百分之百确定。发送者可能意味着随机的胡言乱语,而不是使用同一密钥解密其他英语明文的英语明文,但英语的概率非常接近100%。同样,当在一个长的utf-8日文诗歌密码和乱七八糟的字符串之间进行选择时,这首诗的概率接近100%。这可以使用事后概率而不是前冲约束来完成。这显然不能做一般,但它仍然很有用。
- 仅仅使用加盐密码是不够安全的,应该使用密码哈希(当然,它包括使用相当大的盐),例如bcrypt。
理论上你不能。散列的关键是它只是一种方式。这意味着,如果有人设法获得哈希列表,他们仍然无法获得您的密码。另外,这意味着即使有人在多个站点上使用相同的密码(是的,我们都知道不应该这样做,但是…)任何有权访问站点A的数据库的人都将无法在站点B上使用用户的密码。
MD5是哈希的事实也意味着它会丢失信息。对于任何给定的MD5哈希,如果允许任意长度的密码,可能会有多个密码产生相同的哈希。对于一个好的散列,在计算上不可能找到超过一个非常小的最大长度的散列,但这意味着无法保证如果您找到一个具有目标散列的密码,它肯定是原始密码。你不太可能看到只有两个ASCII码,长度合理的密码有相同的MD5散列,但这并非不可能。
MD5是用于密码的错误哈希:
- 它很快,这意味着如果你有一个"目标"散列,尝试大量的密码并看看你是否能找到一个散列到目标的散列值是很便宜的。salting对这种情况没有帮助,但它有助于增加使用不同盐的多个哈希中的任何一个匹配密码的开销。
- 我相信它已经知道了一些缺陷,可以更容易地发现冲突,尽管在可打印文本(而不是任意二进制数据)中发现冲突至少会更困难。
我不是一个安全专家,所以除了"不要使用你自己的认证系统"之外,我不会提出具体的建议。找一个信誉良好的供应商,然后使用它。安全系统的设计和实现都是一项棘手的工作。
- 感谢您的回答,是否还有其他保存密码的方法可以在以后的时间内撤消。
- 是的,还有其他的方法,但是你需要理解乔恩上面说的话——"你不应该把他们的密码通过电子邮件发送给他们——这是敏感信息,可能会保持敏感。"——在最低级别,电子邮件可以被截获,敏感信息可以被检索。密码应该尽可能地保持安全-通常只将其作为哈希保存在数据库中。
- 还有一个事实,如果密码可以被撤销,那意味着任何访问您的数据库的人都可以获得用户的密码。不是个好主意。单向密码应该是标准的;只有在您必须(例如,使用另一个没有基于令牌的系统进行身份验证)的情况下才保留真正的密码(甚至是加密的)。
- 24小时是很多时间。我会把时间缩短到10分钟左右。即使您首先需要登录到您的电子邮件帐户,这也足够了。
- @秋葵:你什么时候开始计时?只给10分钟不允许服务器延迟,如果电子邮件没有立即发送怎么办?
- 我看到过反垃圾邮件措施,接收者Web服务器拒绝接收的邮件,只是为了等待发送者的邮件服务器重试(垃圾邮件通常只尝试一次)。很容易超过10分钟的超时时间。
- @Gumbo一次性使用比时间框架更重要。如果中间有人或者有人可以访问用户的电子邮件,这是一场简单的比赛,对任何一方都没有优势。我们应该假设我们输了——接下来最好的事情就是马上知道有什么地方出错了,因为一次性密码已经被使用了。
- 这让我想起了我听过的一个故事,一个从来没有用过密码的人,每次需要登录时,他都让恢复系统生成一个新的密码。
- @Jonskeet那么这个网站是如何做到这一点的md5decrypt.org
- @Ravisoni:这是找到一个具有相同哈希值的值,可能是通过蛮力或查找表找到的。无法保证它是原始纯文本值。
- @但我总是用这个网站来获取任何未知的密码值,这总是正确的…
- @拉维森:你说的"对"是什么意思?如果密码未知,则无法知道显示的密码是否为原始密码。但关键是,像MD5这样的哈希表在定义上会丢失信息。事实上,像这样的网站可以想出一个匹配的密码,这只是一个很好的证据,证明MD5是一个糟糕的算法,用于安全原因。
- 这个怎么样?
- @Kiranrs:在某些情况下,它会找到一个具有相同哈希值的值。这并不意味着它是最初使用的,在许多情况下,它找不到任何东西。(从页面上看:"我们的数据库包含超过15186881个唯一的MD5哈希。"这真的不多。)
从技术上讲,这是"可能的",但在非常严格的条件下(彩虹表,基于用户密码在哈希数据库中的可能性非常小的暴力强制)。
但这并不意味着
您不想"反转"MD5哈希。使用下面概述的方法,您将不需要这样做。"反转MD5实际上被认为是恶意的——一些网站提供了破解和暴力破解MD5散列的能力——但它们都是包含字典单词、以前提交的密码和其他单词的大型数据库。有一个非常小的机会,它将有MD5哈希你需要逆转。如果你已经用盐腌制了MD5哈希-这也不管用!:)
使用MD5哈希的登录方式应该是:注册期间:用户创建密码->使用MD5对密码进行散列->存储在数据库中的散列
登录期间:用户输入用户名和密码->(用户名已检查)使用MD5对密码进行哈希处理->将哈希与数据库中存储的哈希进行比较
当需要"丢失密码"时:2个选项:
- 用户发送了一个随机密码以登录,然后在第一次登录时被窃听以更改密码。
或
- 向用户发送一个链接以更改其密码(如果您有安全问题,则进行额外检查/etc),然后对新密码进行哈希处理,并用数据库中的旧密码替换新密码。
- 我有些吹毛求疵。彩虹桌不是残忍的强迫。实际上,有一些程序和站点使用暴力(非常简单)的几个字符的密码(通常它们只循环几个小时或几天,您可以填写一个哈希表,并希望它在循环中出现)。不幸的是,由于缺少许多密码的质量,一个弹出的机会并不是"一个很小的机会"。
不是直接的。由于鸽子洞原理,有(可能)多个值散列到任何给定的MD5输出。因此,你不能确定地逆转它。此外,MD5使得很难找到任何这样的反向散列(然而,有一些攻击会产生冲突——也就是说,生成两个散列到相同结果的值,但您无法控制生成的MD5值是什么)。
但是,如果将搜索空间限制为(例如)长度小于n的普通密码,则可能不再具有不可逆属性(因为MD5输出的数量远远大于感兴趣域中的字符串数量)。然后您可以使用彩虹表或类似的反向散列。
- 我要补充的是,找到另一个散列到相同输出的值称为"冲突"。这是破坏MD5哈希系统的最常见方法。
- @重新生成,找到哈希到先前已知值的数据被称为"preimage",实际上,它比碰撞要困难得多。目前还没有针对MD5的预映像攻击,但是已经使用了碰撞攻击。
- 散列函数(用于密码存储时)的要点不是有许多可能的密码提供相同的散列(有,但大多数密码比散列本身长),而是很难找到其中的一个(这足以访问系统)。是的,因为有彩虹桌,所以你不使用不加盐的哈希表。由于密码空间很小,您将使用慢速哈希(如bcrypt或scrypt)而不是快速哈希(如md5/sha-*/…)。
- 从技术上讲,您不能确定地执行MD5,因为硬件可能出现故障。同样,您可能无法确定密码是password,而不是产生相同哈希的所有其他无限输入,但这些输入看起来很随机,但您可以足够接近。
- 当然,鸽子洞原则也适用,但是在计算上仍然不可能找到第二个对某个值进行哈希运算的输入,例如对普通密码进行哈希运算。如果你找到一个x,它散列到一个给定的h(x),那么你可以确定x是正确的输入。这使得这个答案的第一部分和其余大部分都不正确。
不可能,至少在合理的时间内是不可能的。
这通常是通过密码"重置"来处理的。也就是说,你给他们一个新的(随机的)密码,然后通过电子邮件发送给他们。
- 如果散列值不是用盐腌制的,你会惊讶于谷歌搜索散列值的频率有多高…
- 但是,对于密码检索系统来说并不实际,即使是未加安全保护的系统也是如此。)
无法还原MD5密码。(任何语言)
但你可以:
给用户一个新的。
登记一些彩虹桌,也许可以取回旧的。
- 拒绝彩虹桌的想法。如果你在用盐腌制,而且你应该这样做,那么不管怎样,它都不会起作用。
- @stevensudit如果他们仍然使用md5来散列密码,而不是使用强密码散列,那么您不能假设他们使用的是salt。也许他们有,也许他们没有。
不,他一定对MD5字典很困惑。
加密散列(MD5等)是一种方法,只有摘要才能返回到原始消息,除非您有关于原始消息的其他信息,等等,您不应该这样做。
解密(通过算法直接从哈希值中获取纯文本),没有。
然而,也有一些方法使用所谓的彩虹表。如果你的密码是无盐散列的,那是非常可行的。
做这件事不容易。首先,这就是散列密码的要点。:)
您应该能够做的一件事是手动为它们设置一个临时密码并将其发送给它们。
我不愿意提这个,因为这是一个坏主意(而且无论如何也不能保证有效),但是你可以尝试在彩虹表(如milw0rm)中查找散列值,看看你是否可以这样恢复旧密码。
MD5是散列算法,不能还原散列值。
您应该添加"更改密码功能",用户在其中提供另一个密码,计算散列并将其存储为新密码。
看看这里所有其他的答案,关于它是如何和为什么是不可逆的,以及为什么你无论如何都不想这样。
为了完整起见,有彩虹表,您可以在上面查找可能的匹配项。不能保证彩虹表中的答案是您的用户选择的原始密码,这样会使他们非常困惑。
此外,这对盐渍大麻也不起作用。许多安全专家都推荐使用盐渍法。
- 不正确。如果找到匹配项,则确定它将是原始密码。如果不是这样的话,那么在任何h(x)中,如果x是一条没有由对手确定的预定义结构的消息,就可能产生冲突。对于加密安全哈希函数,即使它是一个断开的哈希函数(如MD5),也无法在计算上找到这种冲突。
- @Maartenbodewes:"如果找到匹配项,那么它肯定是原始密码。"如果我们假定密码的长度不受限制,我看不出情况如何。我会说它极有可能是原始密码,但不一定是。密码可能比MD5哈希多,这意味着必须有两个具有相同哈希的密码。仅仅因为在计算上找不到这样的碰撞并不意味着它们不存在。还是我误解了你?
- @如果故意发现碰撞在计算上是不可行的,那么偶然发现碰撞的可能性也同样不大,甚至更糟。由于MD5的输出空间有限和生日问题,您发现冲突的可能性大约是2^64中的1(即大约一半的输出空间),这是在匹配大约2^64哈希之后。这甚至没有考虑到消息可能需要小一些,并且具有特定的格式才能被视为密码。大多数密码的熵大大低于2^64位。
- @马滕波德韦斯:但是"天文上不可能"和"不可能"之间有很大的区别。在我看来,你对它的声明是肯定的,它是正确的密码,太强了。这表明一个数学上的确定性是不存在的。
- 您还可以一次猜测2^128位AES密钥。这"只是"极不可能。密码学依赖于这种几率。对于所有实际用途,如果您找到一个输入消息/密码,它将是您要查找的那个。理论上可以找到另一个输入消息是很好的,但是对于StackOverflow这个问题,不需要考虑它。彩虹表中只有可能的密码。它们将不包含足够的数据,甚至不可能发生碰撞(它们可能在不知情的情况下覆盖映射或变得出名)。
在查找哈希函数的反函数时,无法"还原"哈希函数。如前所述,这是拥有散列函数的全部要点。它不应该是可逆的,并且应该允许快速的散列值计算。因此,找到产生给定哈希值的输入字符串的唯一方法是尝试所有可能的组合。因为这个原因,这被称为蛮力攻击。
尝试所有可能的组合需要花费大量的时间,这也是使用哈希值以相对安全的方式存储密码的原因。如果攻击者能够使用数据库中的所有用户密码访问您的数据库,则在任何情况下都会释放。如果您有散列值和(理想地说)强密码,那么从攻击者的散列值中获取密码将非常困难。
存储散列值也没有性能问题,因为计算散列值的速度相对较快。所以大多数系统所做的就是计算用户输入的密码的散列值(这很快),然后将其与用户数据库中存储的散列值进行比较。
- 这个答案没有什么错,除了散列函数的速度是一个非常大的问题,因为大多数密码不够安全,不允许对手执行字典攻击。因此,使用慢速密码哈希函数代替快速加密安全哈希函数。
MD5被认为是中断的,不是因为您可以从散列返回原始内容,而是因为通过工作,您可以将两条消息散列到同一散列。
不能取消对MD5哈希的哈希。
- 根据设计,所有相同长度的散列都会发生碰撞。在限制可变长度数据时,这是不可避免的。MD5被认为是过时的,因为它的碰撞率,而不是因为碰撞的事实。
- MD5被认为是坏的,因为已经证明了构造冲突输入的可能性。
是的,你想要的正是可能的。在没有帮助的情况下,"解密"MD5密码是不可能的,但是可以将MD5密码重新加密到另一个算法中,而不是一次完成所有操作。
您所做的是安排您的用户能够使用旧的MD5密码登录到新系统。在他们登录的时候,他们给了你的登录程序一个未显示的密码版本,你证明这个版本与你拥有的MD5散列相匹配。然后您可以将这个未显示的密码转换为新的哈希算法。
显然,这是一个扩展过程,因为您必须等待用户告诉您密码是什么,但它确实有效。
(注:七年后,希望有人会发现它有用)
- 谢谢你的回复。不过,我要对你说:"我不记得我是否真的做到了这一点,但理论上它是可行的。"您可以简单地加密他们密码的哈希版本,而不是等待每个用户登录以便我们重新加密他们的密码。所以每个密码都将被MD5散列,然后被加密。只是更新了密码检查,这样做,用户数据应该是安全的,而不需要用户干预。
- 以上我的评论还有一个警告。我不是加密方面的专家,所以我不确定这是否会进一步影响安全性。例如,加密加密前弱散列的弱密码可能会危害加密的安全性(也可能使用另一个salt?)。此外,您还可以使用这些MD5哈希密码进行备份。在进行这种类型的升级时,最好对所有现有密码进行完全失效。
- 密码学家担心双重加密,但我认为他们只发现了一些小问题。但我认为在这种情况下它并不有用,因为MD5对于(不太长的,文本)密码仍然是安全的。不过,如果以前的开发人员忘记添加salt,那么使用双哈希可能会很有用,否则,我想不出一种情况,即您不必告诉每个人密码应该被视为pwned。希望您的备份不会丢失,而且无论如何都是加密的。
唯一能起作用的是(如果我们提到密码只是散列,不添加任何类型的salt来防止重播攻击,如果是这样的话,你必须知道salt),顺便得到一个字典攻击工具,许多单词、数字等的文件,然后创建两行,一行是单词、数字(在字典中),另一行是散列如果匹配的话,比较哈希值…
这是唯一的方法,不需要进行密码分析。
您可以找到使用字典检索原始邮件的在线工具。
在某些情况下,字典方法可能是无用的:
例如,这里有一个MD5解密器在线工具。
- 彩虹表-不是字典攻击-如果使用盐是无用的。虽然在网上找到一个预先存在的表的可能性肯定较小,但是多次散列(没有盐)仍然允许使用彩虹表。
MD5有其弱点(见维基百科),所以有一些项目试图预先计算哈希。维基百科也暗示了其中的一些项目。我所知道(和尊重)的是奥普拉克。您不能告诉用户自己的密码,但您可以告诉他们一个有效的密码。但我想:只要给他们寄一个新密码,以防他们忘记。
- MD5被破坏的事实(对于函数的特定但重要的用途)与彩虹表(这是在提到哈希的预计算时所暗示的)毫无关系。
MD5哈希算法是不可逆的,所以MD5在解码中是不可能的,但是有些网站有大量的密码匹配,所以你可以尝试在线解码MD5哈希。
尝试联机:
MD5解密
MD5在线
MD5减速器
- 是的,但是这个问题已经包括在"我知道有字典"这个短语中了。因此,仅仅指出字典并不算是答案。
理论上,不可能对哈希值进行解密,但您有一些肮脏的技术可以让原始的纯文本返回。
暴力变形:所有计算机安全算法都遭受暴力变形。基于这个观点,今天的GPU采用了并行编程的思想,它可以通过使用任何图形处理器对纯文本进行大量的暴力处理来获取纯文本。这个工具hashcat完成这个工作。上一次我查看CUDA版本时,我能在六分钟内粗暴地造出一个7个字母长的字符。
互联网搜索:只需复制并粘贴谷歌上的散列,看看你是否能在那里找到相应的纯文本。这不是一个解决方案,当你正在测试的东西,但它绝对值得一试。有些网站维护字典中几乎所有单词的哈希值。
- 字典攻击是另一种方式,或者与您知道输入密码的其他数据库进行比较。
不,不可能。要么你可以使用字典,要么你可以尝试散列不同的值,直到你得到你正在寻找的散列。但它不能"解密"。
- 我看到了这个网站,它将MD5转换为原始文本:md5.gromweb.com。那怎么可能呢?
- @简单:它们有一个哈希字符串的db。在"将字符串转换为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)来验证在其他系统上生成的密码。接收系统唯一要做的就是存储一个确定性函数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的网站,它对我来说工作得很好,但是这完全取决于你的散列值。如果散列值存储在数据库中,那么你就可以得到实际的字符串。
- 不,MD5不是加密,甚至不是单向加密(一开始就没有意义)。
现在还不可能将密码的散列值放入算法中并以纯文本形式返回密码,因为散列是单向的。但是人们所做的是生成散列并将其存储在一个大表中,这样当您输入一个特定的散列时,它会检查表中是否有与散列匹配的密码,并将该密码返回给您。例如http://www.md5online.org/。现代密码存储系统通过使用salting算法对此进行反击,这样当您在注册期间将相同的密码输入密码框时,会生成不同的哈希值。