如何使用比蛮力更有效的方法破解密码给定其哈希值和盐值?

信息安全 哈希 攻击 密码破解
2021-08-30 15:24:55

我已经能够通过使用蛮力破解密码,给定它们的盐和哈希值。

首先,密码长度为 3,salt 长度为 2:

例如,哈希:rrVo/xC.s5/hQ,盐:rr=> 密码:(thr时间:~0m4.579s)

现在,对于长度为 4 和盐长度为 2 的密码:

例如,哈希:ss1C5xfz6Nggg,盐:ss=> 密码:(four时间:~7m19.531s)

正如我所说,这些密码是使用蛮力算法获得的。它对于较短的密码长度很有用:随着密码字符数的增加,破解密码所需的时间呈指数增长。

我想知道的是更有效的技术来减少搜索空间。

附加信息:

  1. 密码创建使用:AZ、az、0-9 和符号:$、#、+、@、=、/、&

  2. 我一直在使用该openssl命令生成哈希并将它们与给定的哈希进行比较

    $ openssl passwd -crypt -salt rr thr
    

在 bash 脚本中。

4个回答

没有更多信息,您无法减少搜索空间。由于您没有任何有关密码的先验信息,因此您不能从搜索空间中排除任何可能的密码。

如果您的哈希函数(您未指定)有一些漏洞,您可能能够在开始暴力尝试之前了解有关密码的信息(以“a”开头,包含“b”等等......) . 从而减少搜索空间。

可以满足您对更快密码破解的需求的其他东西是彩虹表,它是您在给定盐的情况下执行的预计算,以便以后能够更快地找到密码。彩虹表用作给定哈希的查找表。

假设我们有hash('four','ss') = ss1C5xfz6Nggg,我们知道盐ss我们将执行以下预计算:

预计算彩虹表 实际的彩虹表必须根据哈希值进行排序,以实现快速查找。这样,当给定密码的哈希值时ss1C5xfz6Nggg,我们只需要在彩虹表中查找哈希值,我们的密码就存储在它旁边。从而使破解过程更快(当然以预计算时间为代价)。

编辑: Sjeord的评论是正确的,所以我必须指出:

彩虹表尽管最近作为博客文章的主题很受欢迎,但并没有优雅地老化。密码破解器的 CUDA/OpenCL 实现可以利用 GPU 中可用的大量并行性,达到每秒数十亿个候选密码的峰值。您可以在不到 2 秒的时间内测试所有小于等于 7 个字符的小写字母密码。你现在可以租用硬件,这使得这成为可能,每小时不到 3 美元。每小时大约 300 美元,您可以每秒破解大约 500,000,000,000 个候选密码。

来源

没有办法比蛮力更快地检索密码,但是您可以对蛮力速度进行很多更改。

四(时间:~7m19.531s)

暴力破解这么短的密码需要很长时间。将hashcat与像样的显卡一起使用会大大提高性能。我可以使用以下命令在两秒钟内破解它:

/usr/src/cudaHashcat-2.01/cudaHashcat64.bin ss1C5xfz6Nggg -m 1500 -a 3

salt+hash 系统的全部目的是不应该有比暴力攻击更快的方法。正如 BgrWorker 已经指出的那样,旧的哈希算法实际上存在减少搜索空间的弱点(或者更准确地说:允许计算冲突),但发现一个被认为是一个突破,你会在期刊中找到它而不是在一个stackoverflow的答案。:-)

您可以使用一些常见的技巧:

Rainbow Tables 已经被提及,并且 - 根据盐的大小 - 即使对于实际的哈希和密码长度,它们也提供了一种可能的方法来处理前 100 个左右的密码。

使用字典攻击和破解程序而不是愚蠢的蛮力。密码 aaaaaaaa 的可能性远低于密码“password”或“12345678”,因此首先测试它们是明智的。

最后,在许多现实世界的场景中,网站或公司的密码策略实际上会减少您的搜索空间,有时甚至会显着减少。如果密码不仅可以,而且必须包含,例如,至少一个数字和一个特殊字符,那么您在 8 个字符上的搜索空间就会从 10^15 下降到 10^13。

我相信您的问题是您在 bash 脚本中使用 openssl。这意味着每次新密码尝试都需要产生另一个进程。对于暴力破解,请考虑使用高效的编译编程语言,例如 C。我相信您会发现您的效率提高了一个数量级以上。

当然,这意味着您将不得不重写整个暴力破解应用程序。