2009-04-21 20 views
5

Ho un elenco di password che devo esaminare e determinare se soddisfano la regola 3 di 4 predefinita per AD.Regex che convalida la complessità della password predefinita di Active Directory

Regola è contenere 3 dei seguenti 4 requisiti: minuscolo carattere (az) superiore caso di caratteri (AZ) numerico (0-9) carattere speciale (@ # $%^& *() _ + =)

Sto ancora imparando Regex. So come selezionare solo quelli che soddisfano un qualsiasi caso di carattere, ma non sono sicuro di come fare 3 di 4.

Come nota a margine, la complessità AD ha altre due sottigliezze che sono importanti (ma fuori portata della domanda originale).

È veramente 3 di 5. Il quinto è carattere Unicode. Sii gentile ad aggiornare il Regex con quello.

L'altro non si può avere il valore sAMAccountName in tutta la password (case insensitive), né se si divide il valore displayName in token dividere su di spazio, virgola, trattino, underscore, libbra, tubi e qualcos'altro quelle pedine (3 caratteri e più a lungo) non possono essere interamente nella password, senza distinzione tra maiuscole e minuscole.

risposta

11

Se si vuole veramente una grande regex sarebbe qualcosa di simile:

(?=^.{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 che impone anche la lunghezza della password per essere tra 8 e 255 caratteri. È possibile modificare la parte "{8,255}" nella prima sezione per regolare i requisiti di lunghezza. Vale anche la pena notare che questo funziona per me in un controllo standard ASP.NET RegularExpressionValidator.

Partite: "passw0rd" "passw @ rd" "1B2a345 @ # $%"

non-match: "123123123" "Password" "asdf & amp;"

Source (Matteo Hazzard via RegExLib.com)

+0

Di classe! Mi piace! – geoffc

+0

Solo testare questo approccio mi porta a trovare un caso in cui 't3st33 # 3' si presenta come valido, ma 't3st33 # 33' no. – stevemac

+0

E anche la password1 è valida. – geoffc

1

Si dovrà costruire l'espressione regolare in questo modo:

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 

non sono sicuro se sono scappato correttamente i caratteri speciali. Dipende dal tipo di linguaggio/toolkit che stai utilizzando.

2

Deve essere tutto un unico regex? Puoi eseguire 4 regex, ognuna delle quali controlla una cosa e poi si assicura che 3 delle 4 corrispondano. Sarebbe più facile, meno soggetto a errori e più gestibile.

+0

Beh, una grande regex sarebbe più facile da usare. Devo ancora decidere sullo strumento in cui lo userò. Appoggiandosi a Perl, ma in realtà lo farò probabilmente in Novell Identity Manager in DirXML Script, dato che è già in un sistema IDM. – geoffc

0

Ho modificato la risposta @saul-dolgin far corrispondere esattamente con il charset valido specificato nella domanda (non aa carattere non alfanumerico [^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 impone alle password di avere solo caratteri dalla loro lista. Ho anche cambiato la lunghezza massima a 20.

+0

Sono abbastanza sicuro che "caratteri dalla loro lista" includano tutti i caratteri, inclusi spazi, virgola ecc. .. https://technet.microsoft.com/en-us/library/cc786468(v=ws.10).aspx – Nicow

+0

Voglio dire che altri simboli non elencati si adattano a '[^ A-Za-z0-9] 'modello. io euro, sterlina, yen ... – kpull1

Problemi correlati