Ссылка - проверка пароля

Довольно часто вопросы (особенно те, отмеченные ) попросите способы проверки паролей. Кажется, пользователи обычно ищут методы проверки пароля, которые состоят в том, чтобы гарантировать, что пароль содержит определенные символы, соответствует определенному шаблону и/или подчиняется минимальному количеству символов. Это сообщение предназначено, чтобы помочь пользователям найти подходящие методы для проверки пароля без существенного снижения безопасности.

Итак, вопрос: как следует правильно проверять пароли?

Ответ 1

Dilbert comic strip for Mordac, the preventer of information services

Почему правила проверки пароля плохие?

Наш собственный Джефф Этвуд (блогер Coding Horror и соучредитель Qaru и Stack Exchange) в марте 2017 года написал блог о правилах паролей под названием " Правила паролей - это чушь собачья". Если вы еще не читали этот пост, я бы настоятельно рекомендовал вам сделать это, поскольку он в значительной степени отражает цель этого поста.

Если вы никогда не слышали о NIST (Национальный институт стандартов и технологий), то, скорее всего, вы не используете правильные методы кибербезопасности для своих проектов. В этом случае, пожалуйста, ознакомьтесь с их Руководством по цифровой идентификации. Вы также должны быть в курсе лучших практик кибербезопасности. Специальная публикация NIST 800-63B (Редакция 3) упоминает следующее о правилах паролей:

Верификаторы НЕ ДОЛЖНЫ навязывать другие составные правила (например, требующие смешения разных типов символов или запрещать последовательно повторяющиеся символы) для заученных секретов.

Даже документация Mozilla по проверке данных форм высмеивает правила паролей (архив страниц здесь):

"Ваш пароль должен быть длиной от 8 до 30 символов и содержать одну заглавную букву, один символ и число" (серьезно?)

Что произойдет, если вы введете правила составления для своих паролей? Вы ограничиваете количество возможных паролей и удаляете перестановки паролей, которые не соответствуют вашим правилам. Это позволяет хакерам гарантировать, что их атаки делают то же самое! "Да, но там как перестановки паролей квадриллионом (1 000 000 000 000 000 или 1x10 15)": кластер из 25 графических процессоров взламывает каждый стандартный пароль Windows за <6 часов (95 8= 6 634 204 312 890 625 ~ 6,6x10 15 паролей).

xkcd Этот пост безопасности StackExchange расширяет комикс XKCD, описанный выше.

Как мне проверить пароли?

1. Не создавайте свою собственную аутентификацию

Полностью прекратите требовать пароли и дайте людям войти в систему с помощью Google, Facebook, Twitter, Yahoo или любой другой действующей формы интернет-водительских прав, которая вам удобна. Лучший пароль - тот, который вам не нужно хранить.

Источник: Ваш пароль слишком короткий, Джефф Этвуд.

2. Создание вашей собственной аутентификации

Если вы действительно должны создать свои собственные методы аутентификации, по крайней мере, следуйте проверенным методам кибербезопасности. Следующие два раздела (2.1 и 2.2) взяты из текущей публикации NIST, раздел 5.1.1.2 Запомненные секретные верификаторы.

2.1. Следуйте проверенным методам кибербезопасности

NIST утверждает, что вы ДОЛЖНЫ:

  • Требовать, чтобы выбранные подписчиком секреты были длиной не менее 8 символов.
    • Джефф Этвуд предлагает, чтобы пароли были не менее 10 символов для обычных пользователей и не менее 15 символов для пользователей с более высокими привилегиями (например, администраторы и модераторы).
  • Разрешение выбранных абонентом запоминаемых секретов длиной до 64 символов и более.
    • В идеале, вы не должны даже устанавливать верхний предел для этого.
  • Разрешить всю печать ASCII (включая символ пробела) и Unicode.
    • В целях требований к длине каждая кодовая точка Unicode ДОЛЖНА учитываться как один символ.
  • Сравните предполагаемые секреты со списком, который содержит значения, которые обычно используются, ожидаются или скомпрометированы. Например:
    • Пароли, полученные из предыдущих взломанных корпусов.
    • Словарь слов.
    • Повторяющиеся или последовательные символы (например, aaaaaa, 1234abcd)
    • Специфичные для контекста слова, такие как название службы, имя пользователя и их производные.
  • Предложите руководство для подписчика, например, измеритель надежности пароля.
  • Реализуйте механизм ограничения скорости, который эффективно ограничивает количество неудачных попыток аутентификации, которые могут быть сделаны на учетной записи абонента (см. Ограничение скорости (регулирование)).
  • Принудительное изменение, если есть доказательства компрометации аутентификатора.
  • Разрешить заявителям использовать функцию вставки при вводе запомненного секрета (облегчает использование менеджеров паролей, которые обычно увеличивают вероятность того, что пользователи выберут более надежные запомненные секреты).

2.2. НЕ используйте методы, описанные в этом разделе!

В той же публикации также говорится, что вы НЕ ДОЛЖНЫ:

  • Усекни секрет.
  • Разрешить подписчику хранить подсказку, доступную для неаутентифицированного заявителя.
  • Предложите подписчикам использовать определенные типы информации (например, "Как звали вашего первого питомца?") При выборе заученных секретов.
  • Наложить другие правила композиции (например, требовать сочетания разных типов символов или запрещать последовательно повторяющиеся символы) для заученных секретов.
  • Требовать, чтобы запомненные секреты были изменены произвольно (например, периодически).

Существует множество веб-сайтов, объясняющих, как создавать "правильные" формы проверки пароля: большинство из них устарели и не должны использоваться.

3. Использование парольной энтропии

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

3.1. Обзор энтропии паролей

На самом базовом уровне энтропия пароля может быть рассчитана по следующей формуле:

E = log2(R^L)

В приведенной выше формуле:

  • E представляет энтропию пароля
  • R - количество символов в пуле уникальных символов.
  • L - количество символов в пароле.

Это означает, что R^L представляет количество возможных паролей; или, с точки зрения энтропии, количество попыток, необходимых для исчерпания всех возможностей.

К сожалению, эта формула не учитывает такие вещи, как:

  • Общие пароли: т.е. Password1, admin
  • Имена: т.е. John, Mary
  • Обычно используются слова: то есть в английском языке, the I
  • Перевернутые/перевернутые слова: т.е. drowssap (пароль задом наперед)
  • Подстановка букв (иначе как leet): т.е. [email protected]$$w0rd

Добавление логики для этих дополнительных соображений представляет большую проблему. См. 3.2 для существующих пакетов, которые вы можете добавить в свои проекты.

3.2. Существующие проекты энтропии паролей

На момент написания этой статьи самой известной из существующих библиотек для оценки надежности пароля является zxcvbn от Dropbox (проект с открытым исходным кодом на GitHub). Он был адаптирован для поддержки


Делать это неправильно

Однако я понимаю, что у всех разные требования и что иногда люди хотят поступать неправильно. Для тех из вас, кто соответствует этому критерию (или не имеет выбора и представил все, что выше этого раздела и даже больше вашему менеджеру, но они отказываются обновлять свои методы), по крайней мере разрешите символы Юникода. В тот момент, когда вы ограничиваете символы пароля определенным набором символов (т.е. Убедитесь, что существует ASCII-символ в нижнем регистре, az или указываете символы, которые пользователь может или не может ввести [email protected]#$%^&*()), Вы просто запрашиваете беда!

PS Никогда не доверяйте проверке на стороне клиента, поскольку ее очень легко отключить. Это означает для тех из вас, кто пытается проверить пароли, используя STOP. См. JavaScript: проверка на стороне клиента и на стороне сервера для получения дополнительной информации.

Следующий шаблон регулярных выражений работает не на всех языках программирования, но работает на многих основных языках программирования ( ). Обратите внимание, что следующее регулярное выражение может не работать на вашем языке (или даже на языковой версии), и вам может потребоваться использовать альтернативы (например, : см. Регулярное выражение Python, соответствующее свойствам Юникода). В некоторых языках программирования даже есть лучшие методы для проверки такого рода вещей (например, с помощью плагина проверки пароля для ) вместо изобретения колеса. При использовании следующее допустимо, если используется дополнение XRegExp или какой-либо другой инструмент преобразования для классов Unicode, как обсуждалось в регулярных выражениях Javascript + Unicode.

Если вам нужно запретить ввод управляющих символов, вы можете запросить пользователя о совпадении с регулярным выражением, используя шаблон [^\P{C}\s].Это будет соответствовать ТОЛЬКО контрольным символам, которые также не являются пробельными символами - т.е. горизонтальная табуляция, перевод строки, вертикальная табуляция.

Следующее регулярное выражение гарантирует, что в пароле длины символа 8+ есть хотя бы одна строчная буква, прописная буква, число и символ:

^(?=\P{Ll}*\p{Ll})(?=\P{Lu}*\p{Lu})(?=\P{N}*\p{N})(?=[\p{L}\p{N}]*[^\p{L}\p{N}])[\s\S]{8,}$
  • ^ Утвердить позицию в начале строки.
  • (?=\P{Ll}*\p{Ll}) Убедитесь, что существует хотя бы одна строчная буква (в любом сценарии).
  • (?=\P{Lu}*\p{Lu}) Убедитесь, что существует хотя бы одна заглавная буква (в любом сценарии).
  • (?=\P{N}*\p{N}) Убедитесь, что существует хотя бы один числовой символ (в любом сценарии).
  • (?=[\p{L}\p{N}]*[^\p{L}\p{N}]) Убедитесь, что хотя бы один из символов (в любом сценарии) не является буквой или цифрой существует.
  • [\s\S]{8,} Соответствует любому символу 8 или более раз.
  • $ Подтвердить позицию в конце строки.

Пожалуйста, используйте вышеприведенное регулярное выражение по своему усмотрению. Вы были предупреждены!