Регулярное выражение, проверяющее сложность пароля Active Directory по умолчанию - PullRequest
5 голосов
/ 22 апреля 2009

У меня есть список паролей, которые мне нужно проверить и определить, соответствуют ли они правилу 3 из 4 по умолчанию для AD.

Правило содержит 3 из 4 следующих требований: строчные буквы (a-z) символ верхнего регистра (A-Z) числовой (0-9) специальный символ (! @ # $% ^ & * () _ + =)

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

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

Это действительно 3 из 5. Пятый - символ Юникода. Приятно обновить Regex этим.

С другой стороны, вы не можете иметь полное значение sAMAccountName в пароле (без учета регистра), а также если вы не разбиваете значение displayName на токены, разделенные на пробел, запятую, тире, подчеркивание, фунт, трубу и что-то еще, эти токены ( 3 символа и более) не могут быть целиком в пароле, без учета регистра.

Ответы [ 4 ]

13 голосов
/ 02 июля 2010

Если вы действительно хотите одно большое регулярное выражение, это будет что-то вроде этого:

(?=^.{8,255}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.*

Обратите внимание, что он также устанавливает длину пароля от 8 до 255 символов. Вы можете изменить часть "{8,255}" в первом разделе, чтобы настроить требования к длине. Также стоит отметить, что это работает для меня в стандартном элементе управления ASP.NET RegularExpressionValidator .

Совпадения: "Passw0rd", "passW @ rd" "1B2a345 @ # $%"

Несоответствия: "123123123" "Пароль" "asdf & amp;"

Источник (Мэтью Хаззард через RegExLib.com)

2 голосов
/ 22 апреля 2009

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

1 голос
/ 22 апреля 2009

Вам нужно будет создать регулярное выражение следующим образом:

rule = [ "[a-z]", "[A-Z]", "[0-9]", "[!@#$%\^\&\(\)\+=]" ]

regex = ""
first = true
for a in 0..3:
  for b in 0..3:
    if a == b: continue
    for c in 0..3:
      if a == c or b == c: continue
      if not first:
        regex += "|"
      regex += "(" + rule[a] + ".*" + rule[b] + ".*" + rule[c] + ")"
      first = false

Я не уверен, правильно ли я экранировал специальные символы. Это зависит от используемого вами языка / инструментария.

0 голосов
/ 11 марта 2015

Я отредактировал ответ @ saul-dolgin , чтобы он точно совпадал с действительным набором символов, указанным в вопросе (не не алфавитно-цифровой символ [^A-Za-z0-9]):

(?=^[A-Za-z\d!@#\$%\^&\*\(\)_\+=]{8,20}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[!@#\$%\^&\*\(\)_\+=])(?=.*[a-z])|(?=.*[!@#\$%\^&\*\(\)_\+=])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[!@#\$%\^&\*\(\)_\+=]))^.*

Microsoft заставляет пароли иметь только символы из своего списка. Я также изменил максимальную длину на 20.

...