概述
现代散列方法(password_hash使用)故意很慢,无法完全按照您的要求进行。大多数甚至抵制使用 GPU 进行并行化。
因此,如果您的目标是针对现代密码算法加快运行 1 GB 密码列表的速度,那么答案只有一个:如果不在一个巨大的计算集群上运行整个程序,就没有办法做到这一点。即便如此,足够长的密码实际上也无法破解。
你无法完成你想要做的事情。
号码
“你不能这样做”是一种可以使用一些硬数字的陈述!
哈希率
要破解密码,我们首先需要知道我们可以多快测试哈希。当有人试图使用具有 4 个 GPU 的破解装置破解Ashley Madison 数据转储中的密码时,我大量借鉴了现实生活中的例子。这比您的典型家庭用户可以使用的硬件要好得多。在这种情况下,bcrypt 被配置为使用成本因子 12(也就是 4069 轮散列),而 4 GPU 设备每秒只能管理 156 个散列。对于较低的成本因素,哈希率会迅速上升。PHP 默认使用 10,这会导致哈希率提高 4 倍。我们会为了好玩而四舍五入,并假装我们设法达到 750 哈希/秒。
哈希
接下来我们需要知道我们试图破解多少个密码。让我们举几个例子:所有可能的 4 个字符的密码(数字、字母、10 个特殊字符)、所有可能的 6 个字符的密码、所有可能的 8 个字符的密码,或者一个 1Gbyte 的文件,里面装满了密码。这是每个列表中有多少个密码:
- 所有 4 位密码:
72^4 = ~27,000,000组合
- 所有 6 位密码:
72^6 = ~74,000,000,000组合
- 所有 8 位密码:
72^8 = ~700 trillion组合
- 一个 1GB 的文件:约 100,000,000 个密码(假设每个密码平均 10 个字节)
哈希时间
我们知道我们想要散列多少个密码和我们的散列率(750/s),所以现在简单的数学告诉我们使用顶级散列算法运行这些列表需要多长时间:
- 所有 4 位密码:~10 小时
- 所有 6 位密码:~6 年
- 所有 8 位密码:~30,000 年
- 1 GB 文件:~1.5 天
对于更实际的数字,我使用自己机器的一个 CPU 粗略估计了哈希率,每秒管理大约 10 个哈希。使用该哈希率:
- 所有 4 位密码:~30 天
- 所有 6 位密码:~450 年
- 所有 8 位密码:约 200 万年
- 1 GB 文件:~115 天
概括
给自己买六个高质量的 GPU,假设你使用默认的成本因素,你将能够在大约一天内破解所有可能的 4 位密码。尝试只输入 6 位密码,但仍需要数年时间。您的 1 GB 文件充满密码更难猜测时间,但实际上,即使有一堆 GPU 帮助您,仍然需要几天时间才能完成。