Вопрос в регулярном выражении для проверки надежности пароля

#regex #passwords

#регулярное выражение #пароли

Вопрос:

Я ищу единственное регулярное выражение для наших требований к паролю. Пароли:

  • Должно содержать не менее 8 символов
  • Не может содержать пробелы
  • Содержит как строчные, так и ПРОПИСНЫЕ символы
  • Содержит хотя бы одну цифровую цифру
  • Содержит по крайней мере один специальный символ (т. Е. любой символ, которого нет 0-9,a-z,A-Z )

Комментарии:

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

2. Я вижу комбинаторный взрыв…

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

4. Актуально — thedailywtf.com/Articles/Security-by-PostIt.aspx

Ответ №1:

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

Ответ №2:

Идея и большая часть работы взяты из http://www.zorched.net/2009/05/08/password-strength-validation-with-regular-expressions /

 ^S*(?=S{8,})(?=S*[a-z])(?=S*[A-Z])(?=S*[d])(?=S*[W])S*$
  

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

Комментарии:

1. Почти 1. Статья, на которую дана ссылка, хорошая, но в ней ошибочно предлагается использовать .* звездочку с точкой в начале выражения (это не обязательно, потому что звездочка с точкой в конце будет соответствовать строке). Хотя это не наносит вреда для этой конкретной проблемы (ваш ответ правильный и работает нормально), это приведет к сбою, если существует верхний предел длины пароля. Если требование к длине составляет от 8 до 12 символов, то правильным выражением было бы: ^(?=.{8,12}$)(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*W)S*$ (Обратите также внимание, что в предпросмотре нет необходимости в S .) В остальном хороший ответ.