Я хочу создать регулярное выражение для правил безопасности паролей

При создании пароля я хочу проверить, соответствует ли входное значение условиям.

правила следующие:

  • Длина 9 или более символов и 20 символов или менее, без учета пробелов.

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

Регулярное выражение для этого правила было создано следующим образом. И это работает хорошо.

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9])(?!.*\s).{9,20}$

Пример)

  • Прописные + строчные + цифра + специальный символ, ОК

  • Нижний регистр + цифра + специальный символ, НЕТ

Однако на этапе понижения уровня безопасности на один уровень возникла проблема.

Измененные правила заключаются в следующем:

  • Длина 9 или более символов и 20 символов или менее, без учета пробелов.

  • Должно содержать не менее 3 из следующих символов: цифры, прописные буквы, строчные буквы и специальные символы.

Пример)

- Прописные + строчные + цифры + специальные символы, ОК

- Нижний регистр + цифры + специальные символы, ОК

- Прописные + строчные + цифры, ОК

- Прописные + строчные + специальные символы, ОК

Пожалуйста, помогите мне!!

Я попробовал составить каждое правило отдельно.

  • Длина: от 9 до 20 символов без пробелов.
^[\S]{9,20}$
  • Исключение специальных символов
(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*
  • Исключение заглавных букв
(?=.*?[^a-zA-Z0-9])(?=.*?[0-9]).*?[a-z].*
  • Исключение номеров
(?=.*?[^a-zA-Z0-9])(?=.*?[A-Z]).*?[a-z].*
  • Исключение строчных букв
(?=.*?[^a-zA-Z0-9])(?=.*?[0-9]).*?[A-Z].*

Однако я думаю, что было бы лучше сделать их все сразу, объединив, как раньше.

Смотрите в reexegg

DuesserBaest 16.08.2024 09:31

«Я думаю, что было бы лучше сделать их все сразу, объединив» — на самом деле нет.

Bergi 16.08.2024 09:31

Не. Просто убедитесь, что пароль достаточно длинный. Мин. 24 символа. Это намного лучше, чем эти дерьмовые наборы правил.

Marc 16.08.2024 09:33

и 20 символов или меньше"? Зачем людям это делать? В чем причина такого решения? Многим пользователям 20 символов недостаточно.

jabaa 16.08.2024 09:47

Итак, вы хотите сопоставить как минимум 3 правила из 4, где правило 1 — это 1 цифра, правило 2 — 1 заглавная буква, правило 3 — 1 строчная буква, а правило 4 — 1 специальный символ, верно?

The fourth bird 16.08.2024 10:20
Должен ли я устанавливать максимальную длину паролей? «Пароли хешируются до 32, 40, 128, любой длины. Единственная причина установки минимальной длины — это предотвращение легкого подбора паролей. Максимальная длина не имеет смысла».
jabaa 16.08.2024 10:30

На самом деле, только что заметил, что ваш пароль принимает практически любые символы, включая смайлы или управляющие символы. Возможно, лучше заменить .{9,20} на [\p{L}\p{N}\p{Sm}\p{Sc}\p{Sk}\p{P}]{9,32}, который будет принимать буквы любого языка, цифры, некоторые группы символов и знаки препинания с использованием классов Юникода. Вы также можете заменить [a-z] на \p{Ll} и [A-Z] на \p{Lu}, чтобы принять «àéü» или «ÜÔ» как допустимые строчные и прописные буквы. Эмодзи, вкладка, вертикальная вкладка или любой другой проблемный символ не пройдут.

Patrick Janser 16.08.2024 11:59

Пожалуйста, прочитайте эту страницу о проверке пароля.

AdrianHHH 16.08.2024 12:22

Вы можете облегчить жизнь и сохранить возможность обслуживания задачи, если разобьете ее на части. Проверьте длину, а затем проверьте наличие массива условий. Если 3 из 4 успешны -> пройдено (Демо JS на tio.run)

bobble bubble 16.08.2024 13:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
113
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Пытаться:

^((?=[^a-z]*[a-z])(?=[^0-9]*[0-9])(?=[^_\W]*[_\W])|(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])(?=[^_\W]*[_\W])|(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^_\W]*[_\W])|(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9]*[0-9]))[\S]{9,20}$

См.: regex101


Объяснение:

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

  • ^: начало строки
  • (?:...): условия
    • (?=[^a-z]*[a-z])(?=[^0-9]*[0-9])(?=[^_\W]*[_\W]): убедитесь, что все, кроме заглавной буквы
    • |(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])(?=[^_\W]*[_\W]): или используйте все буквы, кроме строчных.
    • |(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^_\W]*[_\W]): или убедитесь, что все, кроме цифры
    • |(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9]*[0-9]): или обеспечить все, кроме особенного
  • \S{9,20}$: сопоставьте от 9 до 20 символов, не являющихся пробелами.

@CarySwoveland, пожалуйста, попробуйте отдельные строки, и вы увидите, что это работает. Причина неудачи в ваших настройках заключается в том, что предварительные просмотры могут просматривать разрывы строк и утверждать, что (в данном случае) специальные символы работают. Если это проблема в реальном варианте использования, добавьте [^...]{0,19} вместо [^...]*.

DuesserBaest 19.08.2024 08:37

Я понимаю. Если я могу предложить, когда вы ссылаетесь на regex101.com, вы должны включить хотя бы одну тестовую строку. Вы также можете изменить там свое регулярное выражение, чтобы оно больше не поглощало символы новой строки. Например, в недавнем ответе SO я предложил один из терминов регулярного выражения: (?=-[^-]*, что, конечно же, соответствует символу новой строки. Я изменил это на (?=-[^-\n]*, и после моей последней тестовой строки добавил текст: «Примечание: \n включен только в классы символов, чтобы разрешить здесь тестирование регулярного выражения на нескольких строках».

Cary Swoveland 19.08.2024 23:57

@CarySwoveland Большое спасибо за ваш отзыв! Я не был уверен, не будет ли это просто «ненужно» загромождать фактическое регулярное выражение для целей отображения, поэтому я решил не делать этого. Я все еще думаю, что это хорошее замечание!

DuesserBaest 20.08.2024 09:03

Судя по всему, вопрос подразумевает, что специальный символ — это любой символ ASCII, который не является пробелом, цифрой, прописной или строчной буквой.

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

^                       # match the beginning of the string
(?:                     # begin a non-capture group
  (?=.*[^\s\dA-Za-z])   # pos lookahead asserts string contains a
                        # special character
  (?:                   # begin a non-capture group
    (?=.*\d)            # pos lookahead asserts string contains a digit
    (?=.*[A-Z])         # pos lookahead asserts string contains an UC letter
  |                     # or
    (?=.*\d)            # pos lookahead asserts string contains a digit
    (?=.*[a-z])         # pos lookahead asserts string contains a LC letter
  |                     # or
    (?=.*[A-Z])         # pos lookahead asserts string contains an UC letter
    (?=.*[a-z])         # pos lookahead asserts string contains a LC letter
  )                     # end non-capture group
|                       # or
  (?=.*\d)              # pos lookahead assert string contains a digit
  (?=.*[A-Z])           # pos lookahead asserts string contains an UC letter
  (?=.*[a-z])           # pos lookahead asserts string contains a LC letter
)                       # end non-capture group
[ ]*                    # match zero or more spaces
(?:                     # begin non-capture group
  [^ ]                  # match a char other than a space
  [ ]*                  # match zero or more spaces
)                       # end non-capture group
{9,20}                  # execute the preceeding non-capture grouip 9-20 times
$                       # match the end of the string

Демо

Я написал выражение в расширенном режиме (так называемом режиме свободного пространства), чтобы сделать его самодокументируемым. Пробелы, являющиеся частью регулярного выражения, должны быть защищены, иначе они будут удалены на этапе предварительной обработки. Я решил поместить каждый в класс символов ([ ]). Альтернативно, их можно экранировать (\ ) или использовать определенные токены Unicode.

Другие вопросы по теме