卡巴斯基实验室对暴力攻击抵抗力的研究发现,很大比例的密码(59%)可以在一小时内被破解。
密码通常是如何存储的?
为了能够对用户进行身份验证,网站需要一种方法来存储登录密码对,并使用这些密码对来验证用户输入的数据。在大多数情况下,密码以哈希而非明文形式存储,这样攻击者就无法在发生泄露时使用它们。为了防止在彩虹表的帮助下猜到密码,密码存储时还会在哈希之前添加盐。
虽然哈希本质上是不可逆的,但是可以访问泄露数据库的攻击者可以尝试猜测密码。他们的尝试次数是无限的,因为数据库本身没有任何防止暴力破解的保护机制。现成的密码猜测工具(如hashcat)也可以在网上轻松获取。
方法论
卡巴斯基的研究调查了在各种暗网网站上发现的1.93亿个密码,并估计了使用暴力和各种高级算法(如字典攻击和/或常见字符组合枚举)从哈希中猜测密码所需的时间。通过字典,我们可以了解密码中常用的字符组合列表。它们包括但不限于真正的英语单词。
暴力攻击
暴力破解方法仍然是最简单、最直接的方法之一:计算机尝试所有可能的密码选项,直至找到有效的为止。但这并非一种“放之四海而皆准”的方法:枚举会忽略字典密码,而且在猜测较长的密码时明显比猜测较短的密码更差。
卡巴斯基研究人员分析了应用于所审查数据库的暴力破解速度。为了清楚起见,研究人员将示例中的密码根据其包含的字符类型划分为不同模式。
- a:密码只包含小写字母或大写字母。
- aA:密码同时包含小写字母和大写字母。
- 0:密码包含数字。
- !:密码包含特殊字符。
使用暴力破解密码所需的时间取决于字符类型的长度和数量。表中的结果是针对RTX 4090 GPU和加盐MD5哈希算法计算的。此配置中的枚举速度是每秒1640亿个哈希值。表格中的百分比为四舍五入。
密码模式 | 该类型密码在数据集中的份额,% | 暴力破解密码的份额(按模式,%) | 最长密码长度(按破解时间) | |||||||
<60s | 60s-60min | 60min-24h | 24h-30d | 30d-365d | >365d | 24h-30d | 30d-365d | >365d | ||
aA0! | 28 | 0.2 | 0.4 | 5 | 0 | 9 | 85 | - | 0 | 10 |
a0 | 26 | 28 | 13 | 15 | 11 | 10 | 24 | 11 | 12 | 13 |
aA0 | 24 | 3 | 16 | 11 | 0 | 15 | 55 | - | 10 | 11 |
a0! | 7 | 2 | 9 | 0 | 14 | 15 | 59 | 9 | 10 | 11 |
0 | 6 | 94 | 4 | 2 | 0 | 0 | 0 | - | - | - |
a | 6 | 45 | 13 | 10 | 9 | 6 | 17 | 12 | 13 | 14 |
aA | 2 | 15 | 22 | 11 | 14 | 0 | 38 | 10 | - | 11 |
a! | 1 | 6 | 9 | 11 | 0 | 11 | 62 | - | 10 | 11 |
aA! | 0.7 | 3 | 2 | 12 | 10 | 0 | 73 | 9 | - | 10 |
0! | 0.5 | 10 | 27 | 0 | 18 | 13 | 32 | 10 | 11 | 12 |
! | 0.006 | 50 | 9 | 10 | 5 | 6 | 19 | 11 | 12 | 13 |
最流行的密码类型(28%)包括小写字母和大写字母、特殊字符和数字。在所审查的样本中,大多数密码都很难被暴力破解。大约5%的密码可以在一天内被猜出,但85%的密码需要一年以上才能破解。破解时间取决于密码的长度:9个字符的密码可以在一年内被猜出,但包含10个字符的密码则需要一年多。
最难抵御暴力破解的密码是那些仅由字母、数字或特殊字符组成的密码。样本中这样的密码占比14%。它们中的大多数可以在不到一天的时间内破解。
智能暴力攻击
如上所述,暴力破解是一种次优密码猜测算法。密码通常由特定的字符组合组成:单词、姓名、日期、序列(“12345”或“qwerty”)。如果让暴力算法考虑下述内容将可以加速这一过程:
- Bruteforce_corr是暴力破解方法的优化版本。您可以使用大样本来测量某个密码模式的频率。接下来,您可以为每个品种分配与其实际频率相对应的计算时间百分比。因此,如果有三种模式,并且第一种模式在50%的情况下使用,第二种和第三种模式在25%的情况下使用,那么我们的计算机每分钟将花费30秒来枚举模式1,15秒来枚举模式2和模式3。
- ZXCVBN是一种用于测量密码强度的高级算法。该算法识别密码所属的模式,如“单词、三位数字”或“特殊字符、字典单词、数字序列”。接下来,它计算枚举模式中每个元素所需的迭代次数。因此,如果密码包含字典单词,那么查找它将需要与字典大小相等的迭代次数。如果模式的一部分是随机的,则需要对其进行暴力破解。如果您知道猜测模式的每个组件所需的时间,则可以计算破解密码的总复杂性。此方法有一个限制:成功枚举需要指定密码或假设模式。但是,您可以通过使用被盗样本来发现模式的流行程度。然后,与暴力破解选项一样,为模式分配与出现次数成比例的计算时间。我们将这个算法命名为“zxcvbn_corr”。
- Unogram是最简单的语言算法。它不需要密码模式,而是依赖于从密码样本中计算出的每个字符的频率。该算法在枚举时优先考虑最流行的字符。因此,要估计破解时间,只需计算密码中出现字符的概率即可。
- 3gram_seq、ngram_seq是根据前n-1个字符计算下一个字符的概率的算法。该算法首先枚举一个字符,然后依次添加下一个字符,同时从最长和最频繁出现的n-gram开始。在这项研究中,研究人员使用了n-gram(从1到10个字符不等),其在密码数据库中出现了50多次。3gram_seq算法限制为n-gram,最多包括三个字符。
- 3gram_opt_corr、ngram_opt_corr是n-grams的优化版本。之前的算法通过每次添加一个字符来从头生成密码。然而,在某些情况下,如果从末尾、中间或同时从多个位置开始,枚举速度会更快。*_opt_*算法检查上述特定密码的变体,并选择最佳密码。然而,在这种情况下,我们需要一个密码模式,允许我们确定从哪里开始生成。当针对不同的模式进行调整时,这些算法通常较慢。不过,它们可以为特定密码提供显著的优势。
此外,对于每个密码,我们计算了一个最佳值:在所使用的所有算法中最佳的破解时间。这是一个假设的理想情况。为了实现它,您需要“猜测”一个合适的算法,或者在自己的GPU上同时运行上述每个算法。
下面是通过在RTX 4090 GPU上运行加盐MD5算法来测量密码强度的结果。
破解时间 | 被暴力破解密码的百分比 | |||||||
ngram_seq | 3gram_seq | unogram | ngram_opt | 3gram_opt | zxcvbn | bruteforce | 最佳 | |
<60s | 41% | 29% | 12% | 23% | 10% | 27% | 10% | 45% |
60s-60min | 14% | 16% | 12% | 15% | 12% | 15% | 10% | 14% |
60min-24h | 9% | 11% | 12% | 11% | 12% | 9% | 6% | 8% |
24h-30d | 7% | 9% | 11% | 10% | 11% | 9% | 9% | 6% |
30d-365d | 4% | 5% | 7% | 6% | 8% | 6% | 10% | 4% |
>365d | 25% | 30% | 47% | 35% | 47% | 35% | 54% | 23% |
结果显示,当使用最有效的算法时,所审查的样本中有45%的密码可以在一分钟内猜出,59%可以在一小时内猜出,73%可以在一个月内猜出。只有23%的密码需要一年以上才能破解。
重要的是,猜测数据库中的所有密码所花费的时间几乎与猜测其中一个密码所花费的时间一样多。在攻击过程中,黑客会检查数据库中当前迭代中获得的哈希值。如果哈希值存在于数据库中,那么该密码将被标记为已破解,算法将继续处理其他密码。
使用字典单词会降低密码强度
为了找到最能抵御黑客攻击的密码模式,研究人员计算了一组扩展标准的最佳值。为此,研究人员创建了一个包含四个或更多字符的常用组合的字典,并将它们添加到密码模式列表中。
- dict:密码包含一个或多个字典单词。
- Dict_only:只包含字典单词。
密码模式 | 该类型密码在数据集中的份额,% | 字典攻击破解密码的份额(按模式,%) | 最长密码长度(按破解时间) | |||||||
<60s | 60s-60min | 60min-24h | 24h-30d | 30d-365d | >365d | 24h-30d | 30d-365d | >365d | ||
dict_a0 | 17 | 63 | 15 | 8 | 5 | 3 | 7 | 10 | 11 | 12 |
aA0! | 14 | 5 | 6 | 5 | 5 | 3 | 76 | 6 | 7 | 8 |
dict_aA0 | 14 | 51 | 17 | 10 | 7 | 4 | 11 | 9 | 10 | 11 |
dict_aA0! | 14 | 34 | 18 | 12 | 10 | 6 | 20 | 7 | 8 | 8 |
a0 | 10 | 59 | 22 | 6 | 6 | 8 | 6 | 10 | 11 | 12 |
aA0 | 10 | 19 | 13 | 13 | 6 | 7 | 42 | 9 | 10 | 11 |
0 | 6 | 92 | 5 | 5 | 3 | 0 | 0 | 15 | - | - |
dict_a0! | 5 | 44 | 16 | 10 | 8 | 5 | 17 | 9 | 9 | 10 |
dict_a | 4 | 69 | 12 | 6 | 4 | 2 | 6 | 11 | 12 | 13 |
a0! | 2 | 31 | 19 | 13 | 9 | 5 | 23 | 9 | 9 | 10 |
a | 2 | 76 | 7 | 6 | 3 | 3 | 6 | 11 | 12 | 13 |
dict_aA | 2 | 56 | 15 | 8 | 6 | 3 | 11 | 9 | 10 | 10 |
dict_a! | 0.8 | 38 | 16 | 10 | 8 | 5 | 23 | 8 | 9 | 10 |
aA | 0.7 | 26 | 10 | 28 | 7 | 2 | 27 | 9 | 10 | 10 |
dict_aA! | 0.5 | 31 | 17 | 11 | 10 | 6 | 26 | 8 | 9 | 9 |
0! | 0.4 | 53 | 15 | 8 | 7 | 5 | 13 | 9 | 10 | 11 |
dict_only | 0.2 | 99 | 0.01 | 0.0002 | 0.0002 | 0 | 0 | 18 | - | - |
dict_0 | 0.2 | 89 | 6 | 2 | 2 | 0 | 0 | 15 | - | - |
aA! | 0.2 | 11 | 8 | 10 | 16 | 3 | 52 | 8 | 9 | 9 |
a! | 0.1 | 35 | 16 | 10 | 9 | 5 | 25 | 8 | 9 | 10 |
dict_0! | 0.06 | 52 | 13 | 7 | 6 | 4 | 17 | 9 | 10 | 11 |
! | 0.006 | 50 | 10 | 6 | 8 | 4 | 20 | 8 | 9 | 10 |
结果显示,大多数(57%)被审查的密码包含字典单词,这大大降低了密码的强度。其中一半可以在不到一分钟的时间内破解,67%可以在一小时内破解。只有12%的字典密码足够强,需要一年以上的时间才能猜到。即使使用了所有推荐的字符类型(大写字母、小写字母、数字和特殊字符),也只有20%的密码能抵抗暴力破解。
研究发现最流行的字典序列包括以下几种:
- 名字:“艾哈迈德”、“阮”、“kumar”、“凯文”、“丹尼尔”;
- 热门词汇:“永远”、“爱”、“谷歌”、“黑客”、“游戏玩家”;
- 标准密码:password、qwerty12345、admin、12345、team。
非字典密码占样本的43%。有些为弱密码,例如由相同大小写的字母和数字组成(10%)或仅由数字组成(6%)。然而,添加所有推荐的字符类型(a0 !模式)使得76%的密码足够强大。
结语
现代GPU能够以惊人的速度破解用户密码。最简单的暴力破解算法可以在不到一天的时间内破解任何八个字符以内的密码。智能黑客算法甚至可以快速猜出更长的密码。这项研究让我们对密码强度得出了以下结论:
- 许多用户的密码不够强:59%的密码可以在一小时内被猜出。
- 使用有意义的单词、名称和标准字符组合可以显著减少猜测密码所需的时间。
- 最不安全的密码是完全由数字或单词组成的密码。
为了保护用户帐户免受黑客攻击,建议遵循如下建议:
- 记住,最好的密码是随机的,由计算机生成的。许多密码管理器都能够生成密码。
- 使用助记词,而不是有意义的短语。
- 检查您的密码是否能抵御黑客攻击。您可以在密码检查器或zxcvbn的帮助下做到这一点。
- 确保您的密码不包含在任何泄露的数据库中。使用安全解决方案,提醒用户密码泄露。
- 避免在多个网站使用相同的密码。如果您的密码是唯一的,那么破解其中一个密码会大大降低损害。
原文链接:https://securelist.com/password-brute-force-time/112984/