Pull to refresh

Часто используемые пароли: как не попасться самому и уберечь пользователей

Reading time 4 min
Views 9.7K
Прошлый год был богат на сообщения о взломах соцсетей, организаций и крупных проектов, и почти в каждом фигурировали “часто используемые пароли”, которые, несмотря на свою небезопасность, тем не менее продолжают использоваться миллионами пользователей.

Применение стойких хеш-алгоритмов и “соление” паролей в разы усложняет задачу их грубого перебора, поэтому следующей легкой целью злоумышленников становятся распространенные среди широких масс пароли, которые несложно подобрать “по словарю”. Такой подход и проще, и результативнее, ведь не важно насколько стойкий у вас алгоритм хеширования, популярные пароли могут составить львиную долю всей украденной базы, и раз их можно перебрать за минимальное время, то есть все шансы успеть ими воспользоваться прежде, чем утечка будет обнаружена и пользователи сменят пароли.

Можно ли с этим бороться? — легко! Борются ли с этим? — не встречал. Значит, пора начать.

image

На многих ресурсах к форме регистрации подключают валидатор сложности пароля, но, к сожалению, сам подсчет является спорным и субъективным — зачем-то требуются спецсимволы, большие и малые регистры, при этом не всегда учитывается то, что длина пароля защищает его куда больше. С другой стороны, длинный но простой пароль может быть часто используемым, что никак не делает его безопасным. Это немного отходит от основной темы статьи, поэтому о длине пароля — под спойлером.

Длина пароля, и интересные находки
В теорию самих расчетов сложности пароля я вдаваться не буду, потому как есть очень хорошая статья на хабре про это, и тоже вполне приличное описание на википедии.

Для примера и демонстрации идеи которую я хочу донести, я возьму несколько паролей, например таких:

  1. KCEvcefv4v (10 Символов)
  2. 111111111111111111 (18 символов)
  3. yTp3HHuuCTo9kyTp3HHuuCTo9kyTp3HHuuCTo9k (39 символов)

Сложность полного перебора для этих паролей составляет:

  1. 62^10 = 839E+15 вариантов
  2. 10^18 = 1000E+15 вариантов
  3. 62^39 = … 8E+69 вариантов.

Сравнив первый и второй пароли, получаем, что длинный пароль из цифр не только оказывается сложнее короткого пароля из букв разного регистра и цифр, но и легче запоминается ввиду того, что это просто 18 единиц. Важно понимать, что так как единички захеширование, и атакующему неизвестно какие символы нужно использовать, то для подбора пароля будут использоваться все варианты символов. Но, если вдруг после прочтения статьи все начнут использовать такой пароль, то реальное время его взлома будет миллисекунды, так как он станет часто используемым.

Остается вопрос — зачем приведен длинный и явно “непробиваемый” пароль в этом списке? Внезапно! “утренний стояк” (yTp3HHuuCTo9k), повторенный три раза и достигающий длины 39 символов, входит в первый миллион часто используемых паролей, и при всей своей сложности прогоняется по списку за секунду, все как в жизни, так что, если вдруг вы используете такой пароль, рекомендую сменить.

Но нигде я не видел подсказок типа “эй, друг, этот пароль не то чтобы не сложный, он просто на 10-м месте часто используемых паролей, поэтому на конфиденциальность особо не рассчитывай”.

При определенном желании и сноровке, вы можете найти в интернете кучу бесплатных подборок паролей для просмотра, в том числе и для скачивания. Конечно, для любого специалиста знакомого с консолью и магией “grep” несложно пройтись по файлу с паролями и проверить свой собственный (другой вопрос, что вам скорее всего будет лень, как и мне).

А вот пользователям немного сложнее: они вряд ли тесно знакомы с консолью, у них нет списков часто используемых паролей, и наверняка они даже не подозревают, что с их паролями может быть что-то не так.

Устранять данную несправедливость я решил руководствуясь следующими принципами:

  • Максимально простое решение.
  • Быстрое решение.
  • Возможность гибкой настройки, и работы как с файлами так и БД.
  • Научиться писать сторонние бандлы для Symfony

Посмотреть код или установить бандл вы можете по ссылке:

https://github.com/Nidhognit/PassSecurityBundle

Есть демка, где вы можете проверить пароль (UPD: подразумевается тестовая проверка пароля, и не рекомендуется использование реальных паролей) в режиме онлайн: https://demo-pass-security-bundle.herokuapp.com/

UPD: ВАЖНО! Демка не является сервисом/сайтом/полноценным приложением, и служит только и исключительно для демонстрации работы кода, ссылка на который дана чуть выше. То есть, я в статье расказываю не о сайте где можно проверить пароль, а о решении, которое можно установить себе на проект, и помогать пользователям проверять пароли (как я понял по комментариям это было не очевидно, решил уточнить).

Примечание: В целях обеспечения конфиденциальности, я не храню логи (даже средства логирования не подключаю), не веду статистику, не сохраняю отправленные пароли, а весь код полностью открыт для ознакомления. В качестве платформы для демки выбран heroku.com, отчасти потому, что он со временем убивает сервер и разворачивает его заново с утратой всех промежуточных состояний (поэтому иногда вы можете увидеть 500 при переходе по ссылке, но если обновить страницу, через несколько секунд все будет ок). Однако, я не могу гарантировать полную конфиденциальность — для максимального эффекта разворачивайте проект у себя локально.

Бандл занимается только одной вещью — проверяет пароль по списку, и возвращает номер, под которым тот был найден, либо null.

Изначально, конечно, было желание написать полноценный валидатор пароля, с оценкой сложности и вынесением вердикта, но я остановился на простом поиске позиции, ведь для каждого проекта свои требования к безопасности (хотя, по моему мнению, если пароль найден в списке, то, независимо от его места, он не безопасен, но у вас может быть другое мнение).

В бандл вшиты два файла со списками паролей на 100 тысяч (используется по умолчанию) и на 1 миллион. К слову, если у вас есть интересные списки часто используемых паролей, и вы не против ими поделиться с общественностью, буду благодарен.

Немного об опыте использования


После того как я написал бандл, я протестировал на нем все свои пароли (да, до “grep” руки так и не дошли). С удивлением обнаружил, что один из домашних паролей, несмотря на грозный вид и длину более чем 11 символов, занял совсем не почетное место в списке.

Друзья и знакомые, которые просматривали демку, также обнаружили некоторые свои пароли в числе небезопасных, и пока лидирует знакомый, пароль которого был найден на 39-м месте. Кто сможет опередить его, расскажите :)
Tags:
Hubs:
+4
Comments 43
Comments Comments 43

Articles