我想知道当密码是字典单词以及不是字典单词时暴力破解的时间。
字典密码
大致数字:大约有 1,000,000 个英文单词,如果黑客每秒可以计算大约 10,000 个 SHA-512 哈希(更新:参见 CodesInChaos 的评论,这个估计非常低),1,000,000 / 10,000 = 100 秒。因此,破解单个用户的单字字典密码只需要一分钟多的时间。如果用户连接两个字典单词,你就在几天的范围内,但如果攻击者足够关心的话,仍然很有可能。不仅如此,它开始变得艰难。
随机密码
如果密码是真正随机的字母数字字符序列,大写和小写,那么长度为 N 的可能密码的数量为 60^N(有 60 个可能的字符)。这次我们从另一个方向进行计算;我们会问:给定特定的时间长度,我们可以破解多长的密码?只需使用以下公式:
N = Log60(t * 10,000)
其中 t 是以秒为单位计算散列所花费的时间(再次假设每秒 10,000 个散列)。
1 minute: 3.2
5 minute: 3.6
30 minutes: 4.1
2 hours: 4.4
3 days: 5.2
因此,给定 3 天的时间,如果密码长度为 5 个字符,我们将能够破解密码。
这一切都很简单,但你明白了。更新:请参阅下面的评论,实际上可以破解比这更长的密码。
这里发生了什么?
让我们澄清一些误解:
salt 不会让计算哈希变慢,它只是意味着他们必须单独破解每个用户的密码,并且预先计算的哈希表(流行词:彩虹表)完全没用。如果您没有预先计算的哈希表,并且您只破解一个密码哈希,那么加盐没有任何区别。
SHA-512 的设计并非难以破解。更好的散列算法(如BCrypt、PBKDF2 或 SCrypt)可以配置为需要更长的计算时间,而普通计算机可能每秒只能计算 10-20 个散列。如果您还没有,请阅读有关密码哈希的出色答案。
更新:正如 CodesInChaos 在评论中所写,如果使用正确的硬件来计算 SHA-512 哈希,即使是高熵密码(大约 10 个字符)也可能被暴力破解。
接受答案的注意事项:
截至 2014 年 9 月,公认的答案是不正确且危险的错误:
在您的情况下,破坏哈希算法等同于在哈希算法中发现冲突。这意味着您不需要查找密码本身(这将是原像攻击)...使用生日攻击查找冲突需要 O(2^n/2) 时间,其中 n 是哈希的输出长度位的功能。
生日攻击与破解给定的哈希完全无关。这实际上是原像攻击的完美例子。该公式和接下来的几段导致攻击时间的值非常高且完全没有意义。如上所示,完全有可能在几分钟内破解加盐字典密码。
典型密码的低熵使得您的一个用户使用相对较小的常用密码数据库中的密码的可能性相对较高......
这就是为什么通常单独散列和加盐是不够的,您还需要安装其他安全机制。您应该使用人为减慢熵诱导方法,例如 PKCS#5 中描述的 PBKDF2 ...
是的,请使用计算速度慢的算法,但什么是“熵诱导”?通过散列放置低熵密码不会增加熵。它应该保留熵,但你不能用散列更好地制作垃圾密码,它不是那样工作的。通过 PBKDF2 输入的弱密码仍然是弱密码。