实际上,部分哈希泄漏会有多糟糕?

信息安全 哈希 密码破解
2021-08-22 05:01:56

尽管目前存储密码的建议是使用慢速密钥导出函数,例如 Argon2、scrypt、PBKDF2 或 bcrypt 1,但许多网站仍然使用传统hash(password + salt)方法,其中 MD5、SHA-1 和 SHA-256 是最常用的使用哈希函数。

mySuperSecretPassword123加盐的 SHA-1 哈希!8(L-_20hsE5D0BEE0300BF17508CABA842084753685781907.

假设攻击者将窃取盐和哈希的前半部分,所以E5D0BEE0300BF17508CA. 我们还假设攻击者知道正在使用 SHA-1 以及盐和密码是如何连接的。

攻击者恢复原始密码有多难?


1 bcrypt在技术上不是密钥派生函数,但就这个问题而言,它的功能相同。

3个回答

实际上,它与完整的哈希泄漏一样糟糕


哈希破解是通过以下方式完成的:

  1. 生成候选密码
  2. 散列它们
  3. 将生成的哈希值与要破解的哈希值进行比较

在部分散列泄漏的情况下,这些步骤都不会变慢,因此这与完全散列泄漏的速度非常相似。


请注意,如果部分哈希输出不够长,很多密码候选会匹配。在那种情况下,您无法知道哪个候选人是真正的密码。

这取决于密码的好坏以及哈希前缀的大小。

大前缀/错误密码

如果我们假设这是一个平均 Joe 密码的哈希值,其中包含 30 位熵(“mySuperSecretPassword123”几乎肯定包含比这更少的熵),为了保守起见,我们遵循Kerckhoffs 原则并假设攻击者知道密码是如何生成的,那么只有 2 30 个可能的密码。如果泄露的前缀是 SHA-1 散列的 80 位,则极有可能只有一个候选密码与散列前缀匹配。

基本上,如果log2(password space)小于泄漏的前缀,您不妨认为整个哈希已泄漏。

小前缀/好密码

如果前缀很小或密码很好(ish)怎么办?例如,假设您的密码空间为 2 50,并且您泄露了 40 位前缀。攻击者不能只破解密码,因为大约有 2 10 个密码与哈希匹配,但这仍然是一个问题。2 50太大而无法发起在线攻击,即使没有速率限制。但是如果攻击者可以在离线攻击中将他们的猜测预过滤为匹配前缀的猜测,他们只需要在在线攻击中尝试 2 10,这可能是可行的。

如果log2(password space) - prefix size > 0那时攻击者可能无法破解确切的密码,但如果它足够小,他们可以生成一个密码候选池,用于在线攻击。

很好的密码

当然,如果您以均匀的概率从大于 2 100(保守一点)的密码空间中随机选择,那么泄漏部分或全部哈希是无关紧要的,因为无论如何它永远不会被破解。

如果你只有一半的 160 位散列,那么这意味着你有 80 个未知位。这导致 $2^80 = 1.2089258196146292e+24$ 个可能的哈希值。

这意味着您的密码可以散列到其中一个,并且确实会成倍减少可能密码的数量(减少 2^80 倍),但是如果我们假设您的密码完全是,攻击者无法仅基于此找到您的密码随机的。

显然,这种情况很少发生,所以如果有人使用现代字典攻击来生成密码,他们最终可能会得到一个相对较小的可能密码列表。然后可以针对真正的身份验证服务测试该密码的小列表以获得精确的密码。

TLDR:

  • 如果密码是随机的:应该没问题
  • 如果可以使用现代字典攻击生成密码(例如:smolbanana73):建议更改它。

注意:我是否被 Pwned确实要求您提供密码的前几位以检查它是否在他们的列表中,但它足够小以至于无关紧要。