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

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

Поэтому возникает вопрос: как правильно проверять пароли?

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

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

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

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

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

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

Что произойдет, если вы наложите правила композиции для своих паролей? Вы ограничиваете количество потенциальных паролей и удаляете перестановки паролей, которые не соответствуют вашим правилам. Это позволяет хакерам обеспечить, чтобы их атаки делали то же самое! «Я, но есть как переключение паролей в четыре миллиарда (1 000 000 000 000 000 или 1 × 10 15 : 25-GPU-кластер трещит каждый стандартный пароль Windows в течение 6 часов (95 8 = 6 634 204 318 890 625 206 15 паролей).

XKCD

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

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

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

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

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

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

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

NIST заявляет, что ВЫ ДОЛЖНЫ :

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

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

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

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

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

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

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

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

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

E = log2 (R ^ L)

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

  • Е представляет собой энтропию паролей
  • р – количество символов в пуле уникальных символов
  • L количество символов в пароле

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

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

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

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

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

На момент написания этой статьи наиболее известной существующей библиотекой для оценки надежности пароля является zxcvbn от Dropbox (проект с открытым исходным кодом на GitHub). Он был адаптирован для поддержки .net angularjs c c # c ++ go java javascript object -c ocaml php python rest ruby rust scala


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

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

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

Следующий шаблон регулярного выражения не работает на всех языках программирования, но он используется во многих основных языках программирования ( java .net php perl ruby ). Обратите внимание, что следующее регулярное выражение может не работать на вашем языке (или даже языковой версии), и вам может потребоваться использовать альтернативы (например, python : см. Python regex, соответствующие свойствам Unicode ). Некоторые языки программирования даже имеют лучшие методы для проверки такого рода вещей (т. Е. Использование плагина проверки пароля для mysql ) вместо того, чтобы изобретать колесо. Использование node.js имеет значение, если используется аддон XRegExp или какой-либо другой инструмент преобразования для classов Unicode, как описано в Javascript + Unicode regexes .

Если вам нужно запретить ввод управляющих символов, вы можете запросить пользователя, когда встречается регулярное выражение, используя шаблон [^\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 или более раз.
  • $ Позиция подтверждения в конце строки.

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

  • Регулярное выражение соответствует только буквам
  • Regex соответствует строке, содержащей два имени в любом порядке
  • Свернуть и захватить повторяющийся шаблон в выражении с одним выражением
  • Соответствующее математическое выражение с регулярным выражением?
  • Interesting Posts

    Swift: защита против, если пусть

    Не удалось разрешить целевое «андроид-16»

    Где появляется сообщение System.Diagnostics.Debug.Write?

    Как можно печатать переменную size_t портативно с помощью семейства printf?

    Virtual Desktop Manager для Windows 7

    Как исправить «Выражение типа List требует непроверенного преобразования …»?

    Является ли это совместимым расширением компилятора для обработки стандартных библиотечных функций, отличных от constexpr, как constexpr?

    Подсчитайте вхождения, которые имеет определенное целое число в массиве

    Как напечатать f uint64_t? Сбой: «ложный трейлинг«% »в формате«

    Строка Интерполяция с переменной формата

    Специальные инструкции для виртуальной машины CentOS VBox?

    Обратный вызов jQuery для нескольких вызовов ajax

    Почему std :: cout конвертирует изменчивые указатели в bool?

    Первый подход WSDL: как указать разные имена для wsdl: port и wsdl: binding?

    дождитесь, пока все streamи закончат работу в java

    Давайте будем гением компьютера.