如何破解双重加密的哈希

Sma*_*ker 4 security encryption passwords decryption hashing

我创建了一个像这样加密的哈希:$What_i_made=BCrypt(MD5(Plain Text Password))我想知道它是否可以被破解。目前,我想到了两种方法:

  1. 暴力$What_i_made获取 MD5 Hash 然后对 MD5 Hash 进行字典攻击。但是,这需要很长时间,因为 Bcrypt 太慢了,而且 MD5 有 32 个字符长。
  2. $result=Bcrypt(MD5(random combination))和比较$result,以$What_i_made直到它们匹配。这会快得多,但我不确定如何做到这一点。我尝试过 John 和 Hashcat,但我不确定如何使用它们来完成此操作,因此我正在向社区寻求帮助。谢谢。:)

顺便说一句,任何其他可行的工具也可以,我更喜欢一种允许尝试每种组合而不是字典攻击的方法。

gro*_*taj 6

这种复合散列与普通 bcrypt 相比没有任何好处。由于 MD5 冲突,它可能会稍微弱一些,但我认为实际上没有人可以利用它来使这种攻击更快。无论如何,没有理由使用 MD5 预先散列密码。现在,到实际答案。


你的方法 #2 不起作用,因为 bcrypt 使用集成的随机盐。对相同的输入进行两次散列将产生两个不同的散列,因为会生成不同的盐。

bcrypt 的结果实际上是一个包含实际 hash 和 salt 的数据结构。要验证密码是否正确,您必须从原始散列结构中提取原始盐并使用它来散列要验证的密码。如果生成的哈希与原始哈希匹配,则密码有效。此功能通常由 bcrypt 实现提供。


如果您要执行字典攻击,只需使用 MD5 预先散列字典中的所有条目,然后使用 MD5 字典运行 bcrypt 字典攻击。为成功破解密码反转 MD5 将非常容易,我将其留给您解决。

测试所有组合的基本蛮力攻击对于 bcrypt 是不切实际的,并且 MD5 无关紧要。

  • 这并不是特定于 bcrypt 的,而是加盐的工作原理。如果两个密码相同,则没有盐,它们的哈希值也相同。如果 1000 个用户共享一个密码,攻击者会立即知道它,因为有 1000 个相同的哈希值。破解这个单一的哈希值会打开 1000 个账户。您不能强制用户选择不同的密码,但您可以为每个用户提供一个随机字符串(盐),该字符串在散列之前在内部附加到密码。这有效地使哈希不同。您也需要将此盐以明文形式存储,因为您必须将其附加到密码以验证它们。 (2认同)
  • 使用 BCrypt(MD5(Password)) 的原因之一。如果您的系统当前正在使用 MD5(Password) 并且您想切换到安全的东西,您可以为所有现有密码计算 BCrypt(MD5(Password)),而无需用户更改其密码。 (2认同)

Roy*_*ams 6

作为密码破解者,我鼓励我的所有目标都使用这种技术。;)

这似乎是一个好主意,但事实证明,对于现实世界的攻击,用 bcrypt 包装未加盐的哈希显然比简单地使用 bcrypt 更弱

这是因为攻击者可以这样做:

  1. 获取现有的 MD5 密码 -即使是尚未破解的密码
  2. 将这些 MD5 作为词表针对您的bcrypt(md5($pass))语料库运行,以识别具有已知 MD5 的 bcrypt
  3. 以更高的速度破解bcrypt 之外的 MD5

换句话说,在许多情况下,您可以简单地先破解内部哈希。而对于一个快散如MD5,这意味着可以破解任何密码首先,bcrypt对蛮力攻击性大大减弱。

(我不能相信这项技术,但它非常有效 - 特别是当用户在多个站点重复使用密码,并且攻击者可以访问泄露的密码数据时。)

这是一个更具体的单用户场景:

  • 用户 jo@example.net 在站点 B 上有一个使用 bcrypt(md5($pass)) 的帐户
  • 站点 B 遭到入侵,其密码哈希列表在线泄露
  • 攻击者获取站点 B 泄漏
  • 攻击者对站点 B 转储进行快速运行,并通过测试确定该站点正在使用 bcrypt(md5($pass))
  • 攻击者首先检查他们的集合中是否有任何其他已知的泄漏包含 jo@example.net
  • 如果是这样,并且任何其他泄漏都使用 MD5,则攻击者只需尝试 jo@example.net 的其他 MD5 即可查看 Jo 是否在重用她的密码,而这是 bcrypt“内部”的密码
  • 如果 Jo 的 MD5 在那个 bcrypt 中,攻击者现在可以以极快的速度攻击该 MD5,直到他们发现裂缝。攻击者现在知道站点 B 上 joe@example.net 的原始密码

现在,假设攻击者想要攻击站点 B 上的所有 100,000 个 bcrypt 哈希……但攻击者还可以访问数千个其他泄漏:

  • 攻击者编写脚本来检查与站点 B 匹配的电子邮件地址的所有 MD5 泄漏
  • 攻击者首先针对来自站点 B 的每个特定用户的 bcrypt 尝试用户特定的 MD5。(这是一种“关联攻击”)。攻击者快速破解大约 20%(这也从整体攻击中去除了他们的盐,提高了剩余哈希的攻击速度)
  • 攻击者接下来尝试从常用密码中获取其他已知MD5,并类似地从攻击中删除这些 bcrypt
  • 然后攻击者尝试从这些泄漏中获取其他未知的MD5。如果他们找到了,他们就可以将这些 MD5 作为直接 MD5 进行攻击(根本不涉及 bcrypt)

是的,攻击也可以直接完成 - 通过自己对候选密码进行 MD5 处理,或者使用本机支持的工具bcrypt(md5($pass)),例如MDXfind

$ echo "password" | tee bcrypt-md5.dict 
password

$ echo -n 'password' | md5sum | awk '{print $1}'
5f4dcc3b5aa765d61d8327deb882cf99

$ htpasswd -bnBC 10 "" 5f4dcc3b5aa765d61d8327deb882cf99 | tr -d ':\n' | tee bcrypt-md5.hash; echo 
$2y$10$JUbSRB0GQv.yKorqYdBaqeVYLtbZ/sRXdbPWt6u/6R3tqbaWTlQyW

$ mdxfind -h '^BCRYPTMD5$' -f bcrypt-md5.hash bcrypt-md5.dict 
Working on hash types: BCRYPTMD5 
Took 0.00 seconds to read hashes
Searching through 0 unique hashes from bcrypt-md5.hash
Searching through 1 unique BCRYPT hashes
Maximum hash chain depth is 0
Minimum hash length is 512 characters
Using 4 cores
BCRYPTMD5 $2y$10$JUbSRB0GQv.yKorqYdBaqeVYLtbZ/sRXdbPWt6u/6R3tqbaWTlQyW:password

Done - 1 threads caught
1 lines processed in 0 seconds
1.00 lines per second
0.07 seconds hashing, 2 total hash calculations
0.00M hashes per second (approx)
1 total files
1 BCRYPTMD5x01 hashes found
1 Total hashes found
Run Code Online (Sandbox Code Playgroud)

不幸的是(对于攻击者 ;) ),看起来约翰开膛手“巨型”版本不支持使用其动态语法的此算法:

$ john --format=dynamic='bcrypt(md5($pass))' --test
Error: dynamic hash must start with md4/md5/sha1 and NOT a *_raw version. This expression one does not
Run Code Online (Sandbox Code Playgroud)

但对于专注的攻击者来说,简单地从哈希中挖掘出这些 MD5,然后在 GPU 上以每秒数十亿个候选的速度攻击这些 MD5 会更有效率。

如果你想做这样的事情——例如,解决 bcrypt 的最多 72 个字符的问题——在 MD5 步骤中使用普通盐、站点范围的胡椒或真正的加密。