2009-04-21 9 views
5

J'ai une liste de mots de passe que je dois examiner et déterminer s'ils répondent à la règle 3 sur 4 par défaut pour AD.Regex qui valide la complexité de mot de passe par défaut Active Directory

règle est contenir 3 des 4 conditions suivantes: caractères minuscules (az) caractères majuscules (AZ) numérique (0-9) de caractère spécial (@ # $ de%^& *() _ + =)

J'apprends encore Regex. Je sais comment sélectionner uniquement ceux qui rencontrent un cas de caractère, mais je ne suis pas sûr comment faire 3 sur 4.

En remarque, la complexité AD a deux subtilités supplémentaires qui sont importantes (mais hors de portée de la question initiale).

Il est vraiment 3 sur 5. Le cinquième est un caractère Unicode. Soyez gentil de mettre à jour le Regex avec ça. L'autre est que vous ne pouvez pas avoir la valeur sAMAccountName en entier dans le mot de passe (insensible à la casse), ni diviser la valeur displayName en jetons séparés par espace, virgule, tiret, trait de soulignement, livre, pipe et autre chose. (3 caractères et plus) ne peut pas être dans le mot de passe, insensible à la casse.

Répondre

11

Si vous voulez vraiment un grand regex ce serait quelque chose comme ceci:

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

Notez qu'il applique également la longueur du mot de passe entre 8 et 255 caractères. Vous pouvez modifier la partie "{8,255}" dans la première section pour ajuster les exigences de longueur. Il est également intéressant de noter que cela fonctionne pour moi dans un contrôle ASP.NET standard RegularExpressionValidator.

Correspondances: "PASSW0RD" "PASSW @ rd" "1B2a345 @ # $%"

non Correspondances: "123123123" "Mot de passe" "asdf & amp;"

Source (Matthieu Hazzard via RegExLib.com)

+0

Classy! J'aime ça! – geoffc

+0

Le simple fait de tester cette approche m'amène à trouver un cas où 't3st33 # 3' est valide, mais pas 't3st33 # 33'. – stevemac

+0

Et mot de passe1 montre aussi valide. – geoffc

1

Vous devrez construire l'expression régulière comme ceci:

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 

Je ne sais pas si je me suis évadé des caractères spéciaux correctement. Cela dépend en quelque sorte du langage/de la boîte à outils que vous utilisez.

2

Est-ce que ça doit être une grande regex? Vous pouvez faire 4 expressions régulières, chacune vérifiant une chose et ensuite s'assurer que 3 des 4 sont des correspondances. Ce serait plus facile, moins sujette aux erreurs et plus facile à maintenir.

+0

Eh bien une grande regex serait plus facile à utiliser. Je n'ai pas encore décidé de l'outil que je vais utiliser. Penchement vers Perl, mais en fait probablement dans Novell Identity Manager dans DirXML Script, car il est déjà dans un système IDM. – geoffc

0

Je modifié la réponse @saul-dolgin pour correspondre exactement avec le jeu de caractères valide spécifiée dans la question (non aa caractère non alfanumeric [^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 force les mots de passe à ne contenir que des caractères de leur liste. J'ai également changé la longueur maximale à 20.

+0

Je suis certain que les "caractères de leur liste" incluent tous les caractères, y compris les espaces, les virgules, etc. .. https://technet.microsoft.com/en-us/library/cc786468(v=ws.10).aspx – Nicow

+0

Je veux dire que les autres symboles non listés correspondent à '[[A-Za-z0-9]] 'motif. i.e euro, livre, yen ... – kpull1

Questions connexes