【问题标题】:Decrypting MD5 hashed text when salt is known已知盐时解密 MD5 散列文本
【发布时间】:2021-02-03 04:10:06
【问题描述】:

假设我有以下 MD5 哈希密码:

bec0932119f0b0dd192c3bb5e5984eec

如果我知道原始密码经过加盐和散列处理,并且知道它不是典型的加盐,而是在 MD5 求和之前被包裹在“标志{}”中。

在这种情况下我该如何解密 MD5?

【问题讨论】:

  • 注意:我知道这可以通过蛮力解决,但还有其他解决方案吗?
  • 没有“简单计算”可用,只是蛮力,抱歉。正如其他人所评论的那样:MD5 是散列而不是加密/解密。
  • 至少我能知道长度吗?
  • 长度是多少?如果您指的是“原始密码”的长度,答案很简单:哈希算法的本质是计算具有指定长度的值,而不管输入长度如何。你的蛮力攻击必须以“a”开头并增加......
  • 这能回答你的问题吗? Is it possible to decrypt MD5 hashes?(知道值是如何加盐的对这个问题没有影响。这和找到未加盐的原像一样困难。)

标签: encryption hash cryptography md5


【解决方案1】:

另一个答案在您尝试的定义中不正确。让我们从加密哈希函数所需电阻的正式定义开始。以下来自 P. Rogaway 和 T. Shrimpton 的Cryptographic Hash-Function Basics: Definitions, Implications, and Separations for Preimage Resistance, Second-Preimage Resistance, and Collision Resistance

  • preimage-resistance — 对于基本上所有预先指定的输出,在计算上找到任何散列到该输出的输入是不可行的,即找到任何原像 x' 使得 h(x') = y 在给定任何y 对应的输入未知。
  • 2nd-preimage resistance,weak-collision——在计算上找到与任何指定输入具有相同输出的任何第二个输入是不可行的,即给定x,找到第二个原像@987654333 @ 这样h(x) = h(x')
  • 抗碰撞,强碰撞——在计算上不可能找到任何两个不同的输入xx',它们哈希到相同的输出,即h(x) = h(x')

冲突和密码破解不相关。实际上,您正试图找到一个与给定哈希值和盐一起工作的原像。在 MD5 n=128 的情况下,通用原像攻击的成本是 O(2^n),即 O(2^128)。 MD5 上存在比泛型更好的原像攻击,代价为2^123.4

如上所述,MD5 不再具有加密安全性,因为它的抗碰撞能力被破坏了,即使是SHA-1 is no longer secure

hashing is not encryption/decryption。这真的是一个很长的故事,这里有个简短的回答,加密是可逆的,但哈希不是(考虑鸽巢原理,看看单向函数)[小注block cipher mode of operation like the CTR mode doesn't requires a PRP it can work with PRF,它就是这样设计的]...

你能做什么?

  • 首先,使用John the Ripper password cracker

    如果没有找到,那么

  • 根据您的预算在一定限度内对 MD5 构建快速的原像攻击。 hashcat 是一个非常强大的工具,您可以从中受益来构建它。这里是 hashcat 的表现;

    hashcat with Nvidia RTX 3090 可以搜索65322.5 MH/s(百万哈希/秒)。那是2^16 MH/s。计算——时间、设备成本、电费——可以根据已知的目标搜索空间来完成。

【讨论】:

    【解决方案2】:

    MD5是一个哈希函数,你不能真正解密结果(请搜索哈希和解密的区别)。

    但是 - 您可能会尝试找到冲突 - 输入给出相同的哈希值。它有一定的概率会匹配原始输入。加密哈希函数被设计成很难(不可行)找到冲突,但是对于 MD5 来说它不再有效(这就是为什么 MD5 被认为不安全使用)

    您可以查看资源Vlastimil Klima: Tunnels in Hash Functions: MD5 Collisions Within a Minute,还有更多与最新隧道攻击相关的参考资料和工具。

    【讨论】:

    • 嗨,我找不到可以帮助我的程序/网站。 (我也想写我的,但失败了)我想给一个程序一个可能的输入列表,每个字符和字长,然后开始测试
    • 例如如果我给它 flag{} 长度为 3 我希望它尝试 flag{3a4}, flag{12a}
    • @Dan:这种攻击会找到一个“等效”密码,即与原始密码一样有效的密码,因为它具有相同的哈希值。它不一定会找到原始密码。
    • @dan 我在那里发布的链接还有一个应用程序,但它有助于找到等效输入(产生相同哈希值的输入)。如果您真的在寻找原始密码,那么暴力破解是您唯一的选择。您也可以编写自己的应用程序。 Tried to write mine as well and faild 好吧,再努力一点,下次再失败会更好。
    • 请参阅我关于在哈希函数上查找原像的答案。冲突与密码破解无关。我已经把正式的定义..