【问题标题】:Why am I getting only 800 hashes per second?为什么我每秒只能得到 800 个哈希值?
【发布时间】:2022-01-15 18:31:39
【问题描述】:

我试图破解一个 6 字符长的密码,但即使过了 10 分钟,它也没有任何进展。所以,我决定找出每秒找到多少个哈希值。

以下代码需要破解密码,即'zzzz',h是crypt给出的hash,s是使用的salt和hash算法。

import crypt
#zzzz
h='$6$XR2ZpTWwyJL90BVD$HpFiwwuLyHOVbWnk/G/gUW.Hz0SutY4F9io4zjWkLL8bK6F3A4WCdSWQNgtq8fTx6PuzM1cdyQdlN2Qv/HlzH.'
s = '$6$XR2ZpTWwyJL90BVD$'

def brute(hash, salt, charSet="abcdefghijklmnopqrtuvxyz"):
    # for pwd_len in range(7):
    for guess in product(charSet,repeat= 4):
        guess=''.join(guess)
        if hash == crypt.crypt(guess,salt):
            return guess
    return -1        

print(brute(h, s))

这是 456,976 个哈希,但是破解密码的时间是 9 分 20 秒,非常慢。我知道单线程并不理想,但它不是仍然很低吗?

【问题讨论】:

  • 好吧,哈希创建 IS 很慢……在程序运行时观察你的 CPU 负载 - 如果它已经满负荷运行,多线程将不会也无济于事。如果不是,则使用多线程。

标签: python crypt sha512


【解决方案1】:

crypt 模块,就像它基础的 crypt() 系统调用一样,用于散列密码,而良好的密码散列算法设计很慢,正是因为他们想要黑客很难完全按照您在此处尝试做的事情。

在您的情况下,如果您使用crypt.mksalt() 的默认参数生成盐,则每次调用crypt.crypt() 都会运行 5000 次 SHA-512 迭代,因此您的程序实际上会在十分钟内计算 2284880000 个单独的 SHA-512 哈希它需要暴力破解这个密码。这听起来应该更合理!

您可能想尝试更改传递给mksalt() 的轮数,看看它如何影响计算时间。

【讨论】:

    【解决方案2】:

    crypt() 函数故意放慢速度以防止这种蛮力攻击,通过使用“轮数”来计算哈希值。 SHA-512方法默认使用5000轮,见the documentation of crypt(3)这个python模块是基于:

    自 glibc 2.7 起,SHA-256 和 SHA-512 实现支持用户提供的散列轮数,默认为 5000。

    实际 SHA-512 散列函数的单次运行速度很快。

    【讨论】:

      【解决方案3】:

      您可以使用您的 GPU 通过hashcat 破解哈希。对于您的情况,

      hashcat -m 1800 -w 3 -O -a 3 '$6$XR2ZpTWwyJL90BVD$HpFiwwuLyHOVbWnk/G/gUW.Hz0SutY4F9io4zjWkLL8bK6F3A4WCdSWQNgtq8fTx6PuzM1cdyQdlN2Qv/HlzH.' ?l?l?l?l
      

      我的 RTX 3080 需要 4 秒。破解 6 个小写字母大约需要 12 分钟。

      【讨论】:

      • hashcat 即使在我的 cpu 上也非常快,我也会在 gpu 上进行测试。感谢您的回答,不幸的是,由于声誉限制,我无法对其进行投票,想补充一点,该命令需要引号内的哈希才能在基于 unix 的系统上工作
      • 我添加了引号。谢谢。