2009-04-21 26 views
5

Tengo una lista de contraseñas que debo examinar y determinar si cumplen con la regla 3 de 4 predeterminada para AD.Regex que valida la complejidad de contraseña predeterminada de Active Directory

Regla es contener 3 de los 4 siguientes requisitos: carácter en minúscula (az) carácter en mayúsculas (AZ) numérico (0-9) carácter especial (@ # $%^& *() _ + =)

Todavía estoy aprendiendo Regex. Sé cómo seleccionar solo aquellos que cumplen con cualquier caso de carácter, pero no estoy seguro de cómo hacer 3 de 4.

Como nota al margen, la Complejidad AD tiene dos sutilezas más que son importantes (pero fuera de alcance) de la pregunta original).

Realmente es 3 de 5. El quinto es el carácter Unicode. Se agradable actualizar la Regex con eso.

La otra es que no puede tener el valor de sAMAccountName entero en la contraseña (no distingue entre mayúsculas y minúsculas), ni si divide el valor displayName en tokens divididos en espacio, coma, guión, guión bajo, libra, pipa y algo más esos tokens (3 caracteres y más) no puede estar en su totalidad en la contraseña, sin distinción de mayúsculas y minúsculas.

Respuesta

11

Si realmente quieres una gran expresión regular sería algo como esto:

(?=^.{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]))^.* 

Nota que también hace cumplir longitud de la contraseña a tener entre 8 y 255 caracteres. Puede cambiar la parte "{8,255}" en la primera sección para ajustar los requisitos de longitud. También vale la pena señalar que esto está funcionando para mí en un patrón de control ASP.NET RegularExpressionValidator.

Partidos: "passw0rd" "Passw @ rd" "1B2a345 @ # $%"

no-partidos: "123123123" "contraseña" "asdf & amp;"

Source (Mateo Hazzard través RegExLib.com)

+0

con clase! ¡Me gusta! – geoffc

+0

El solo hecho de probar este enfoque me lleva a encontrar un caso en el que 't3st33 # 3' aparece como válido, pero 't3st33 # 33' no. – stevemac

+0

Y la contraseña1 también es válida. – geoffc

1

Tendrá que construir la expresión regular como esto:

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

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 

No estoy seguro de si me escapé los caracteres especiales correctamente. Depende del idioma/kit de herramientas que está utilizando.

2

¿Tiene que ser una gran regex? Podrías hacer 4 expresiones regulares, cada una verificando una cosa y luego asegurarte de que 3 de las 4 coincidan. Eso sería más fácil, menos propenso a errores y más fácil de mantener.

+0

Bueno una gran expresión regular sería más fácil de usar. Todavía tengo que decidir sobre la herramienta lo voy a utilizar en. Se inclinó hacia Perl, pero en realidad, probablemente lo haré en el Gestor de identidades en DirXML de secuencias de comandos, ya que está en un sistema de IDM ya. – geoffc

0

que editó la respuesta @saul-dolgin para que coincida exactamente con el juego de caracteres válida se especifica en la pregunta (no aa carácter no alfanumérico [^A-Za-z0-9]):

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

Microsoft obliga a las contraseñas a tener solo caracteres de su lista. También ha cambiado la longitud máxima de 20.

+0

Estoy seguro de que los "personajes de su lista" incluyen todos los caracteres, incluidos los espacios, las comas, etc. .. https://technet.microsoft.com/en-us/library/cc786468(v=ws.10).aspx – Nicow

+0

Quiero decir que otros símbolos que no figuran en la lista caben en '[^ A-Za-z0-9] 'patrón. es decir, euro, libra, yen ... – kpull1

Cuestiones relacionadas