如何破解双重加密哈希

如何破解双重加密哈希

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

  1. 暴力破解$What_i_made获取 MD5 哈希,然后对 MD5 哈希进行字典攻击。但是,这将花费很长时间,因为 Bcrypt 非常慢,而且 MD5 长度为 32 个字符。
  2. $result=Bcrypt(MD5(random combination))并进行比较$result$What_i_made直到它们匹配为止。这样会快得多,但我真的不知道该怎么做。我试过 John 和 Hashcat,但我不确定如何使用它们,所以我向社区寻求帮助。谢谢。:)

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

答案1

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

这似乎是个好主意,但事实证明,面对现实世界的攻击,使用 bcrypt 包装无盐哈希显然比直接使用 bcrypt 要弱

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

  1. 获取现有的 MD5 密码 -甚至还没有被破解的
  2. 将这些 MD5 作为单词列表针对你的bcrypt(md5($pass))语料库进行运行,以识别具有已知 MD5 的 bcrypt
  3. 破解 MD5bcrypt 之外以更高的速度

换句话说,在很多情况下,你可以先破解内部哈希。对于像 MD5 这样的快速哈希,这意味着对于任何可以破解的密码第一的,bcrypt 对暴力攻击的抵抗力是戏剧性地减弱了。

(我不能承担这项被称为“密码破解”的技术的功劳,但它非常有效 - 特别是当用户在多个网站上重复使用密码时,攻击者可以访问泄露的密码数据。)

以下是更具体的单用户场景:

  • 用户[电子邮件保护]在站点 B 上有一个使用 bcrypt(md5($pass)) 的账户
  • 网站 B 遭到入侵,其密码哈希列表在线泄露
  • 攻击者获取站点 B 泄漏信息
  • 攻击者对站点 B 转储进行快速运行,并通过测试确定该站点正在使用 bcrypt(md5($pass))
  • 攻击者首先检查其收藏中是否还有其他已知泄漏包含[电子邮件保护]
  • 如果是这样,并且任何其他泄漏都使用 MD5,攻击者只需尝试[电子邮件保护]的其他 MD5 来查看 Jo 是否重复使用了她的密码,而这个 MD5 就是 bcrypt“内部”的
  • 如果 Jo 的 MD5 位于该 bcrypt 中,攻击者现在可以以极快的速度攻击该 MD5,直到找到破解方法。攻击者现在知道[电子邮件保护]在站点 B 上的原始密码

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

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

是的,攻击也可以直接进行 - 要么自己对候选密码进行 MD5 运算,要么使用原生支持的工具bcrypt(md5($pass)),例如MDX查找

$ 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

不幸的是(对于攻击者来说 ;) ),它看起来像开膛手约翰“巨无霸”版不支持使用该算法的动态语法:

$ 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

但是对于一个专注的攻击者来说,从哈希值中挖掘出那些 MD5,然后在 GPU 上以每秒数十亿个候选的速度攻击那些 MD5,效率要高得多。

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

答案2

这种复合哈希与普通的 bcrypt 相比没有任何优势。由于 MD5 冲突,它可能稍微弱一些,但我认为没有人能够真正利用它来加快这种攻击的速度。无论如何,没有理由使用 MD5 对密码进行预哈希处理。现在,来看看真正的答案。


您的方法 #2 不起作用,因为 bcrypt 使用集成的随机盐。对同一输入进行两次哈希处理将产生两个不同的哈希值,因为会生成不同的盐。

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


如果您要执行字典攻击,只需使用 MD5 对字典中的所有条目进行预哈希处理,然后使用 MD5 字典运行 bcrypt 字典攻击。逆转成功破解的密码的 MD5 将非常容易,我将留给您自己去弄清楚。

测试所有组合的基本暴力攻击对于 bcrypt 来说是不切实际的,并且 MD5 是不相关的。

相关内容