为什么我每秒只能得到 800 个哈希值?

Why am I getting only 800 hashes per second?

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

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

import crypt
#zzzz
h='$XR2ZpTWwyJL90BVD$HpFiwwuLyHOVbWnk/G/gUW.Hz0SutY4F9io4zjWkLL8bK6F3A4WCdSWQNgtq8fTx6PuzM1cdyQdlN2Qv/HlzH.'
s = '$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秒,非常慢。我知道单线程并不理想,但它不是仍然很低吗?

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

Since glibc 2.7, the SHA-256 and SHA-512 implementations support a user-supplied number of hashing rounds, defaulting to 5000.

单个 运行 实际 SHA-512 哈希函数很快。

crypt 模块,就像作为它基础的 crypt() 系统调用一样,用于散列密码,好的密码散列算法是 设计的 放慢速度,恰恰是因为他们想让黑客难以完全按照您的要求进行操作。

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

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

您可以使用 GPU 来破解 hashcat 的哈希值。对于你的情况,

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

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