Вычислительные мощности компьютеров постоянно растут, позволяя пользователям быстрее решать все более сложные задачи. Это приводит, в частности, к тому, что пароли, которые несколько лет назад было невозможно подобрать, в 2024 году злоумышленники могут взломать за считаные секунды. Например, графический процессор RTX 4090 способен подобрать восьмизначный пароль, состоящий из латинских букв одного регистра и цифр (это 36 различных символов, доступных для комбинации), всего за 17 секунд.
Мы провели исследование стойкости паролей к перебору и обнаружили, что большую долю паролей (59%) можно взломать менее чем за час.
Как обычно хранятся пароли
Для аутентификации пользователей сервисам нужно в каком-то виде хранить пары «логин-пароль», с которыми они будут сверять вводимые пользователем данные. В большинстве случаев пароли хранятся не в открытом виде, а в виде хэшей, чтобы в случае утечки злоумышленники не смогли ими воспользоваться. Чтобы исключить подбор пароля по существующим радужным таблицам, перед хэшированием к нему добавляется соль.
Хотя хэши по сути своей необратимы, имея доступ к утекшей базе данных, злоумышленник может попытаться подобрать пароли. При этом у него будет неограниченное число попыток, поскольку сама по себе база данных никак не защищена от перебора. В сети доступны и готовые инструменты для подбора паролей, такие как hashcat.
Методология исследования
Наше исследование проводилось на основе 193 миллионов паролей, обнаруженных в свободном доступе на различных даркнет-ресурсах. «Лаборатория Касперского» не собирает и не хранит пароли пользователей (подробнее об этом можно узнать тут и тут).
Мы оценивали время подбора пароля для его хэша, используя как полный перебор (брутфорс), так и различные продвинутые алгоритмы (перебор, основанный на словаре и/или распространенных комбинациях символов). Под словарем мы в данном случае понимаем перечень комбинаций символов, часто использующихся в паролях. В него входят в том числе и реально существующие слова английского языка.
Брутфорс
Метод полного перебора по-прежнему является одним из самых простых и понятных: машина перебирает все возможные варианты пароля, пока один из них не окажется верным. Такой способ не универсален: при переборе не учитываются словарные пароли, он заметно хуже справляется с длинными паролями, чем с короткими.
Мы проанализировали скорость подбора паролей брутфорсом на исследуемой базе. Для наглядности разделим пароли из выборки на схемы по типам символов, которые в них используются:
- a — в пароле есть строчные или заглавные буквы;
- aA — в пароле есть и строчные, и заглавные буквы;
- 0 — в пароле есть цифры;
- ! — в пароле есть спецсимволы.
Время подбора пароля методом полного перебора зависит от его длины и количества типов символов, в нем использованных. Результаты в таблице рассчитаны для видеокарты RTX 4090 и алгоритма хэширования MD5 с солью. Скорость подбора при такой конфигурации составляет 164 миллиарда хэшей в секунду. Данные в таблице округлены.
Схема пароля | Доля паролей такого типа в выборке, % | Доля паролей, которые можно взломать брутфорсом (по схемам, %) | Минимальная длина пароля в символах по времени взлома | |||||||
До минуты | От минуты до часа | От часа до дня | От дня до месяца | От месяца до года | Более года | От дня до месяца | От месяца до года | Более года | ||
aA0! | 28 | 0,2 | 0,4 | 5 | 0 | 9 | 85 | — | 9 | 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% паролей этого типа понадобится более года. Время подбора зависит от длины: пароль из девяти символов можно подобрать за год, из десяти — более чем за год.
Наименее стойкие для атаки брутфорсом пароли состоят только из букв, только из цифр или только из спецсимволов. Всего таких паролей в нашей выборке было 14%. Большинство из них подбирается менее чем за день. Длина стойкого пароля, состоящего только из букв, начинается с 11 символов. Стойких паролей из цифр в выборке не было.
Умный перебор
Как мы уже отмечали, брутфорс не является оптимальным алгоритмом подбора паролей. Зачастую пользователи в качестве паролей используют определенные комбинации символов: слова, имена, даты, последовательности (12345 или qwerty). Если учитывать это при переборе, можно его ускорить:
- bruteforce_corr — оптимизированная версия полного перебора. На большой выборке можно оценить, как часто используется та или иная схема пароля. А далее каждому варианту отдать долю вычислительного времени, соответствующую частоте встречаемости этой схемы у пользователей. Так, если у нас есть три схемы, из которых первая используется в 50% случаев, а вторая и третья в 25%, то за условную минуту перебора мы будем 30 секунд перебирать схему 1 и по 15 секунд — схемы 2 и 3.
- zxcvbn — продвинутый алгоритм оценки стойкости пароля. Для конкретного пароля алгоритм определяет его схему (например, «слово, 3 цифры» или «спецсимвол, словарное слово, последовательность цифр»). Далее он считает количество необходимых итераций перебора для каждого элемента схемы. Так, если в составе пароля есть словарное слово, то его подбор займет количество итераций, равных длине словаря. Если часть схемы случайна, то ее придется подбирать брутфорсом. Зная оценки времени подбора всех частей схемы, можно рассчитать суммарную сложность подбора пароля. У этого метода есть ограничение: для подбора нужно указать конкретный пароль или предположить его схему. Однако популярность схем можно рассчитать на уже украденных выборках. А далее, как и в варианте с брутфорсом, отдавать схеме вычислительное время, пропорциональное ее встречаемости. Такой алгоритм обозначим как
- unogram — простейший языковой алгоритм. Он не требует парольной схемы, а опирается на частоту использования каждого символа, которую мы можем рассчитать на выборке паролей. При переборе алгоритм отдает предпочтение наиболее популярным символам. Соответственно, для оценки времени подбора достаточно рассчитать вероятность появления имеющихся в пароле символов.
- 3gram_seq, ngram_seq — эти алгоритмы рассчитывают вероятность появления следующего символа в зависимости от n-1 предыдущих. Предполагаемый алгоритм начинает перебор с одного символа, затем последовательно добавляет следующий, начиная с самых длинных и часто встречающихся n-грамм. В исследовании мы использовали n-граммы, встречающиеся в базе паролей более 50 раз, длиной от 1 до 10 символов. Алгоритм 3gram_seq ограничен n-граммами длиной до 3 символов включительно.
- 3gram_opt_corr, ngram_opt_corr — оптимизированная версия n-грамм. Предыдущий алгоритм генерировал пароль с начала, добавляя по одному символу. Однако в некоторых случаях подбор происходит быстрее, если начать с конца, с середины или одновременно из нескольких мест. Алгоритмы *_opt_* проверяют описанные варианты для конкретного пароля и выбирают наилучший из них. Однако в этом случае нам требуется наличие схемы пароля с указанием, откуда начинать генерацию. С корректировкой на разные схемы такие алгоритмы в среднем работают медленнее. Однако для конкретных паролей они могут давать существенное преимущество.
Также для каждого пароля мы рассчитали значение best — лучшее время подбора среди всех использованных алгоритмов. Это гипотетический идеальный случай. Для его реализации понадобится «угадать» подходящий алгоритм или одновременно запустить каждый из описанных алгоритмов на отдельной видеокарте.
Ниже приводятся результаты оценки стойкости паролей описанными алгоритмами на видеокарте RTX 4090 для MD5 с солью.
Время подбора | Доля паролей, которые можно взломать указанным методом | |||||||
ngram_seq | 3gram_seq | unogram | ngram_opt _corr |
3gram_opt _corr |
zxcvbn _corr |
bruteforce _corr |
Best | |
До минуты | 41% | 29% | 12% | 23% | 10% | 27% | 10% | 45% |
От минуты до часа | 14% | 16% | 12% | 15% | 12% | 15% | 10% | 14% |
От часа до дня | 9% | 11% | 12% | 11% | 12% | 9% | 6% | 8% |
От дня до месяца | 7% | 9% | 11% | 10% | 11% | 9% | 9% | 6% |
От месяца до года | 4% | 5% | 7% | 6% | 8% | 6% | 10% | 4% |
Более года | 25% | 30% | 47% | 35% | 47% | 35% | 54% | 23% |
Итого: при использовании наиболее эффективного алгоритма 45% паролей на исследуемой выборке могут быть взломаны за одну минуту, 59% — за один час, а 73% — менее чем за месяц. Только для 23% паролей взлом займет более одного года.
Важно отметить, что подбор всех паролей из базы займет практически столько же времени, сколько и взлом одного пароля. При переборе атакующий проверяет наличие в базе хэша, полученного на текущей итерации. Если хэш имеется в базе, конкретный пароль помечается как взломанный, и алгоритм продолжает подбирать другие пароли.
Словарные слова понижают стойкость паролей
Чтобы проанализировать, какие схемы паролей наиболее устойчивы ко взломам, мы рассчитали значение best для расширенного набора критериев. Для этого мы составили словарь часто встречающихся комбинаций символов длиной от четырех символов и дополнили ими указанные выше схемы паролей.
- dict — пароль содержит одно или несколько слов из словаря.
- dict_only — пароль содержит только слова из словаря.
Схема пароля | Доля паролей, % | Процент паролей, которые можно взломать словарным методом (по схемам, %) | Минимальная длина пароля в символах по времени взлома | |||||||
До минуты | От минуты до часа | От часа до дня | От дня до месяца | От месяца до года | Более года | От дня до месяца | От месяца до года | Более года | ||
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 | 1,8 | 6 | 10 | 11 | 12 |
aA0 | 10 | 19 | 13 | 13 | 6 | 7 | 42 | 9 | 10 | 11 |
0 | 6 | 92 | 5 | 1,5 | 1,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 | 1.2 | 76 | 7 | 6 | 3 | 3 | 6 | 11 | 12 | 13 |
dict_aA | 1.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,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% случаев он будет стойким. Среди самых популярных словарных последовательностей, встречавшихся в паролях, можно выделить несколько групп:
- имена: «ahmed», «nguyen», «kumar», «kevin», «daniel»;
- популярные слова: «forever», «love», «google», «hacker», «gamer»;
- стандартные пароли: «password», «qwerty12345», «admin», «12345», «team».
Паролей, не имеющих словарных слов в составе суммарно 43%. Среди них есть слабые пароли, состоящих, например, только из букв одного регистра и цифр (10%) или только из цифр (6%). Однако, если пароль включает в себя рекомендованный набор: буквы разного регистра, спецсимволы и цифры (схема aA0!), то уже 76% таких паролей являются стойкими.
Выводы
Современные графические процессоры способны подбирать пользовательские пароли с огромной скоростью. Любой пароль длиной до 8 символов взламывается менее чем за день простейшим алгоритмом брутфорса. Умные алгоритмы взлома способны быстро подбирать даже длинные пароли. Они используют словари, учитывают замены символов («е» на «3», «1» на «!» или «a» на «@») и популярные последовательности («qwerty», «12345», «asdfg»).
Это практическое исследование позволяет сделать следующие выводы о стойкости паролей:
- Многие пользовательские пароли недостаточно стойкие, 59% из них можно взломать за один час.
- Использование осмысленных слов, имен и стандартных последовательностей символов в пароле значительно сокращает время его подбора.
- Наименее надежный пароль — полностью состоящий из цифр или только из слов.
Чтобы защитить ваши аккаунты от взлома:
- Помните, что лучший пароль — случайный, программно-сгенерированный. Функция генератора паролей доступна во многих менеджерах паролей.
- Используйте мнемонические фразы, а не осмысленные словосочетания.
- Проверьте устойчивость своего пароля ко взломам. Это можно сделать, например, с помощью Password Checker, Kaspersky Password Manager или утилиты zxcvbn.
- Убедитесь, что ваших паролей нет в утекших базах. Это можно сделать на сайте haveibeenpwned. Используйте защитные решения, которые предупреждают своих пользователей об утечках паролей.
- Не используйте один и тот же пароль в нескольких сервисах. Если ваши пароли будут уникальными, взлом одного из них нанесет меньший ущерб.
Анализ стойкости пользовательских паролей
Антон
А где ещё один вывод, который просто обязан быть? Хватит использовать MD5! Если пароль хэшировать так, что хэширование одного пароля займёт пол секунды (я утрирую), то даже простой пароль брутфорсом будет сложно подобрать.
Alexey Antonov
По нашим данным, к сожалению, более половины паролей все еще храняться в MD5 или MD5+соль. Еще порядка 10-15% хранятся в SHA, что не сильно усложняет подобный взлом. А 5-10% вообще храняться в открытом виде.