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

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

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

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-м месте. Кто сможет опередить его, расскажите :)
Поделиться с друзьями
-->

Комментарии (43)


  1. Elsedar
    15.03.2017 14:05
    +2

    Отправлять свои пароли POST'ом. Нет, спасибо.


    1. Lamaster
      15.03.2017 14:19

      Я, возможно, отстал от индустрии сайтостроения, но как отправлять их правильно?


      1. Elsedar
        15.03.2017 14:40

        Я к индустрии сайтостроения отношения практически не имею, но для подобного сервиса, вероятно, стоило использовать полностью автономное решение на JS.


        1. Nidhognit
          15.03.2017 14:45

          Это ведь не сервис. Это бандл для Symfony framework который просто имеет демку как он работает)


          1. Elsedar
            15.03.2017 14:53

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


            1. Nidhognit
              15.03.2017 14:57

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


              1. Elsedar
                15.03.2017 15:01

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


                1. Nidhognit
                  15.03.2017 15:11
                  +1

                  Согласен, не очевидная формулировка, изменил описание


            1. Isfandiar
              15.03.2017 15:00

              Да даже само скачивание такой демки и разворачивание её у себя не менее подозрительно. Учитывая изощрённость методов добычи данных для доступа — всё может оказаться совсем не тем, чем кажется.


              1. Nidhognit
                15.03.2017 15:08

                Демка состоит из десятка файлов, которые вы можете просмотреть и проанализировать.

                Можете просто подключить код к фреймвору, который дан по первой ссылке, там и вовсе немного кода.


        1. nmk2002
          15.03.2017 16:10
          +1

          Кстати, есть такой сайт: https://howsecureismypassword.net/ Насколько я вижу тут все в js. И никакой отправки на сервер нет.
          Он правда проверяет по 10 000 распространенных паролей.


          1. Nidhognit
            15.03.2017 16:19

            У них подключена гугл аналитика со всеми вытекающими рисками)


        1. noomorph
          15.03.2017 16:43
          +1

          В принципе, я с этим утверждением согласен, но никто не мешает авторам автономного решения на JS подключить как бы невзначай аналитический сервис (хоть бы и Google Analytics), и отправить чего лишнего. Впрочем, можно поставить браузерное расширение, блокирующее сбор аналитики, но и тут нельзя быть уверенным на 100% в его прозрачности.

          Я тут было подумал, что обрубить сбор информации можно гораздо проще и произачнее — отключиться от сети (авиарежим, WiFi, и т. п.), и выполнить проверку оффлайн, но ведь и тут засада — если сайт использует localStorage, Service Workers или некую другую комбинацию техник, то собранную информацию можно придержать до первого удобного случая и отправить позже.

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

          Я это все веду к тому, что «простому пользователю» для обеспечения безопасной проверки пароля в рамках некого веб-сервиса (причем безотносительно метода его доставки — автономное JS-приложение или почти чистое серверное) придется овладеть очень непростыми познаниями в предметной области или довериться экспертам, что тоже имеет свою цену и риски.

          P. S. Кстати, можно было бы добавить в статью прямые ссылки на текстовые базы паролей 100,000 и 1,000,000, «для максимального эффекта».


          1. nmk2002
            15.03.2017 19:29

            Так вот же они на гитхабе: https://github.com/Nidhognit/PassSecurityBundle/tree/master/DataFiles


    1. Nidhognit
      15.03.2017 14:26

      Скачайте код и разверните свое приложение, как я и рекомендую в статье, в чем же проблема?


  1. Isfandiar
    15.03.2017 14:16
    +2

    В наше время цифрового мошенничества и всякого фишинга — вариант проверки пароля на сайте просто идеален для ловли нужных паролей.


    1. Nidhognit
      15.03.2017 14:25

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


      1. Isfandiar
        15.03.2017 14:51

        Тем не менее, многие могут ломануться изучать на этой демке «боевые» пароли, может привести к печальным последствиям. Также можно на основе этой демки собрать «сайт для проверки пароля» и набивать собственный сборник паролей, после чего ломиться по «засвеченным» адресам. Конечно, можно такую подставу орагнизовать и другими способами, но тем не менее.

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

        Может быть, конечно, я просто параноик и везде вижу только угрозу, но вот такой вот штук мне доверия вообще не внушает.


        1. Nidhognit
          15.03.2017 15:05

          Можно сделать форк, если есть страх что оригинал будет изменен, или просто реализовать свой собственный поиск, там все очень просто.

          Я обновил статью чтобы обозначить что демка — это просто демка, а не рабочий сервис.

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


          1. Isfandiar
            15.03.2017 15:12
            +1

            Если ИП — динамика, да ещё и «серый» — то проблем не так и много. А вот если он «белый», что у очень многих организаций, и админ по какой-то причине туда сунулся проверять свой «боевой» пароль (причина по сути не важна) — «профит» можно поиметь.

            Опять же на «сайте-подложке» можно организовать «введите почту, а мы вам вышлем результат» — добраться до логинов в таком случае уже вообще не проблема.


  1. nmk2002
    15.03.2017 15:13
    +4

    Не нашел куда ввести логин.


    1. Isfandiar
      15.03.2017 15:26

      Ага. А чтоб не мучатся — так сразу «сдать» все свои аккаунты по всем, ну или хотя бы по самым популярным, ресурсам ))))


  1. nmk2002
    15.03.2017 15:28
    +1

    39 — jennifer


    1. bopoh13
      16.03.2017 17:48

      jennifer — 32. Плохо, что база не разбита по регионам.


  1. Fen1kz
    15.03.2017 15:56
    +2

    Недавно была противоположная этой статья, процитирую первый комментарий:


    Я пользователь.
    Я хочу свободно заходить на этот сайт не задумываясь над паролем.
    Я не введу никогда сюда свои персональные данные или номер банковской карты.

    Почему. Мне. Нельзя. Использовать. Простой. Словарный. Пароль?


  1. Loki3000
    15.03.2017 16:16

    йцукен
    Congratulations! Your password is a hard nut to crack

    как-тот так:)


    1. ivan386
      15.03.2017 16:23

      Прочитал как "Congratulations! Your password is a hard not to crack"


    1. ivan386
      15.03.2017 16:55

      Можно кстати запилить страницу на которой все эти пароли в алфавитном порядке и пользователь будет просто прокручивать страницу пока не найдет нужное место где может быть его пароль. И тогда не понятно будет нашёл ли он его и если да то какой из тех что на странице.


      Не туда ответил ну пусть уж будет здесь.


      1. Nidhognit
        15.03.2017 17:13

        Проще подгрузить их в js файле на страницу и сделать офлайн поиск. Да, загрузка сожрет десяток метров трафика и займет приличное время, но для настольного компьютера не критично.


        1. ivan386
          15.03.2017 17:17

          Поиск по странице в браузер встроен. И опять же его надо куда-то вводить что рискованно. А тут визульный поиск.


      1. ivan386
        15.03.2017 17:14

        Сделал так. Полностью совпадения не нашёл но есть у которого первых 5 символов те же.


      1. dankovsky
        15.03.2017 17:41

        https://github.com/Nidhognit/PassSecurityBundle/tree/master/DataFiles


  1. dankovsky
    15.03.2017 17:39

    Отличная идея с сервисом, нужно двигать ее дальше.

    Как будет действовать хакер, который хочет заняться перебором? Он не будет просто исходить из списка самых популярных 100к\1м\10м паролей — он найдет все возможные «сливы» паролей за всё время жизни Интернета, и будет проходить по ним от начала и до конца. Мне кажется, нужно действовать аналогичным образом.
    Идеальный сервис был бы тот, который включает в себя максимальную базу всех существовавших сливов паролей (желательно, конечно, в открытом виде, для офлайн поиска в txt), чтобы можно проверить пароль не на отсутствие в списке самых частых, а вообще на отсутствие аналогов в мире.

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

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


    1. Isfandiar
      15.03.2017 17:46

      Идея в принципе лишена смысла, поскольку непонятно какие длины паролей брать. К тому же можно извратиться ASCII-символами.


    1. noomorph
      15.03.2017 17:49

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


  1. yanab
    16.03.2017 13:19

    Не пойму проблем с проверкой. Скачать файл с паролями (скачал на 1 000 000), открыл в блокноте (да, да блокнот Windows 7 его за 15 секунд открыл), и через Ctrl+F ввёл свой пароль.


    1. Nidhognit
      16.03.2017 13:21

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


  1. nikolay206
    16.03.2017 15:38

    Долго использовал пароль qwerty (занял 4 место) и 1q2w3e4r (256 место). После того как ломанули почту пересмотрел свои пароли. Теперь надежные.


  1. Canep7
    17.03.2017 10:53

    Читаю вторую статью про пароли за неделю и не могу «догнать» проблему. Так все усложнили — пароли, словари, нужно нагибать пользователей чтоб придумывали пароли сложнее, а то подбирают быстро и т.п. А еще мощности компьютеров растут — прямо ужас. На этой теме можно зарабатывать. :) Но вот что мешает поступить проще?
    Введите таймаут на ответ по авторизации на 10 секунд, к примеру. Пользователь же входит не сто раз в день, 10 секунд потерпит, особенно, если ему мультик показать. А вот перебирать даже по словарю из 1 000 000 паролей уже замучаешься. На это уйдет больше 3 лет непрерывного взлома, который можно не только засечь по логам, но еще и программно. Да можно и не засекать — попросить пользователей менять пароли раз в год с одним условием — чтоб новый пароль не совпадал со старым, одним старым прошлым паролем… и все… взломать можно будет только случайно.
    Почему так сделать то нельзя?


    1. Nidhognit
      17.03.2017 10:54

      Что помешает сделать 1000 параллельных запросов на сервер? Если пароль очень простой, этого хватит чтобы угадать, если сервер слабый, этого хватит чтобы его положить.

      Кроме того, такая «тяжелая страница» — отличный вариант для DDOS атаки.


      1. Canep7
        17.03.2017 13:10

        А что мешает отклонять все запросы по одному логину кроме самого первого в течении тех 10 секунд хотя бы?
        Почему сервер должен лечь и ДДОС? Т.е. имеется в виду, что сервер пока общается по паролю с одним пользователем, не может ответить другому? А если у того пинг хреновый, то сервер тоже подвисает? :) Что-то тут не так. Ну можно как-то иначе отдалить по времени ответ на авторизацию, чтоб сервер не нагружался.

        Или, как тоже уже много раз делалось, при неудачных запросах по одному логину повторный запрос разрешать только через минуту. Пользователь, если ошибся, не сильно устанет, а вот взломщик сильно. Ограничить опять же число попыток по логину в 10 штук в сутки и все.

        Мне кажется такие методы намного более действенны, чем увеличивать сложность пароля, привнося этим кучу проблем для пользователя и не давая реальной защиты навсегда, а лишь пока не вырастет мощность компьютеров по перебору…


  1. Canep7
    17.03.2017 12:40

    .


  1. MaxxxZ
    18.03.2017 10:08

    Автор, такие подсказки дает уютная жжшечка. Там словарный пароль не поставить. Причем сравнение идет с существующей базой юзеров в том числе.

    А насчет пароля 18 единиц — он очень плох: его раскусит любой сторонний наблюдатель. перебирать потребуется только количество единиц, если кто-то увидел как такой пароль вводят.