破解用 PHP 散列的密码?

信息安全 密码 php 密码破解
2021-08-14 18:42:03

这是破解用 PHP 散列的密码的正确方法吗?

  • 我使用该password_hash函数对密码进行哈希处理(PHP 7.3 版)。

  • 然后我使用 Python 脚本创建了一个单词列表。它的大小约为 1GB。

  • 然后我创建了一个 PHP 脚本来读取该单词列表并使用password_hash.

  • 最后我使用终端执行了 PHP 脚本。

它工作正常,但需要花费太多时间来破解密码。作为一名学生,我喜欢编写自己的脚本和工具。有没有人知道如何以更好的性能和效率做到这一点?

我还搜索了有关使用集群和 GPU 进行密码破解的信息,但我不确定这是否有帮助。

2个回答

概述

现代散列方法(password_hash使用)故意很慢,无法完全按照您的要求进行。大多数甚至抵制使用 GPU 进行并行化。

因此,如果您的目标是针对现代密码算法加快运行 1 GB 密码列表的速度,那么答案只有一个:如果不在一个巨大的计算集群上运行整个程序,就没有办法做到这一点。即便如此,足够长的密码实际上也无法破解。

你无法完成你想要做的事情。

号码

“你不能这样做”是一种可以使用一些硬数字的陈述!

哈希率

要破解密码,我们首先需要知道我们可以多快测试哈希。当有人试图使用具有 4 个 GPU 的破解装置破解Ashley Madison 数据转储中的密码时,我大量借鉴了现实生活中的例子这比您的典型家庭用户可以使用的硬件要好得多。在这种情况下,bcrypt 被配置为使用成本因子 12(也就是 4069 轮散列),而 4 GPU 设备每秒只能管理 156 个散列。对于较低的成本因素,哈希率会迅速上升。PHP 默认使用 10,这会导致哈希率提高 4 倍。我们会为了好玩而四舍五入,并假装我们设法达到 750 哈希/秒。

哈希

接下来我们需要知道我们试图破解多少个密码。让我们举几个例子:所有可能的 4 个字符的密码(数字、字母、10 个特殊字符)、所有可能的 6 个字符的密码、所有可能的 8 个字符的密码,或者一个 1Gbyte 的文件,里面装满了密码。这是每个列表中有多少个密码:

  1. 所有 4 位密码:72^4 = ~27,000,000组合
  2. 所有 6 位密码:72^6 = ~74,000,000,000组合
  3. 所有 8 位密码:72^8 = ~700 trillion组合
  4. 一个 1GB 的文件:约 100,000,000 个密码(假设每个密码平均 10 个字节)

哈希时间

我们知道我们想要散列多少个密码和我们的散列率(750/s),所以现在简单的数学告诉我们使用顶级散列算法运行这些列表需要多长时间:

  1. 所有 4 位密码:~10 小时
  2. 所有 6 位密码:~6 年
  3. 所有 8 位密码:~30,000 年
  4. 1 GB 文件:~1.5 天

对于更实际的数字,我使用自己机器的一个 CPU 粗略估计了哈希率,每秒管理大约 10 个哈希。使用哈希率:

  1. 所有 4 位密码:~30 天
  2. 所有 6 位密码:~450 年
  3. 所有 8 位密码:约 200 万年
  4. 1 GB 文件:~115 天

概括

给自己买六个高质量的 GPU,假设你使用默认的成本因素,你将能够在大约一天内破解所有可能的 4 位密码。尝试输入 6 位密码,但仍需要数年时间。您的 1 GB 文件充满密码更难猜测时间,但实际上,即使有一堆 GPU 帮助您,仍然需要几天时间才能完成。

我真的很喜欢 Conor Mancone 的回答。我唯一要补充的是,您可以通过首先检查最有可能的密码来提高效率,也许可以使用以前泄露的密码列表或您对目标的了解(例如当地运动队)。