2011-01-12 40 views
10

necesito regex coincida con un campo de contraseña usando javascript con los siguientes requisitos:expresión regular coincide con una contraseña segura con dos o más caracteres especiales

  • Al menos 15 caracteres
  • dos o letras de casos más bajos
  • !
  • dos o más letras mayúsculas
  • dos o más dígitos
  • dos o más de los siguientes caracteres especiales: @ # $%^* & -

tengo una expresión regular que se encarga de casos más:

/^.*(?=.{15,})(?=.{2,}\d)(?=.{2,}[a-z])(?=.{2,}[A-Z])(?=.{2,}[\!\@\#\$\%\^\&\*\-]).*$/ 

El problema aquí es con los símbolos, que trabaja con:

[email protected]@ssw0rd 
[email protected]@ 
[email protected]@Pssw0rd 

Pero no:

@@Pssw0rdPssw0rd 

Tengo un generador de contraseñas aleatorias configurado para probarlo exhaustivamente, por lo que cualquier idea es muy apreciada. ¡Gracias!

+0

creo que esto no se puede hacer con un solo * * expresiones regulares. –

+0

@Salman: ¿por qué no? ¿Has oído hablar de lookaheads? –

+4

Recomiendo no hacer esto. La seguridad de las contraseñas forzadas es una de las principales razones por las que los usuarios crean "contraseña1" o "PAssword! @ 12345" en su caso. – yorick

Respuesta

15
/^(?=(?:.*[a-z]){2})(?=(?:.*[A-Z]){2})(?=(?:.*\d){2})(?=(?:.*[[email protected]#$%^&*-]){2}).{15,}$/ 

Sus búsquedas hacia delante están equivocados. El patrón

(?=.{2,}[class]) 

significa para que coincida con 2 o más caracteres (no importa qué caracteres), a continuación, seguido de 1 carácter de la clase deseada. Esto es completamente diferente de "2 o más caracteres de la clase deseada" que especificó.

Para probar correctamente si un carácter de clase deseada está en el texto, utilice

(?=.*[class]) 

y puesto que usted quiere comprobar dos veces, repetir el patrón

(?=.*[class].*[class]) 
# equivalent to (?=(?:.*[class]){2}) 
+0

Probado y confirmado con 100,000 contraseñas creadas al azar. Usted señor es un Jedi Regex, gracias! – rwyland

+0

Me gustaría agregar que esta expresión regular funciona multiplataforma, pero si la usas en JavaScript NO funcionará en IE7 debido al problema de búsqueda anticipada en el motor de JavaScript. [link] (http://stackoverflow.com/questions/3999733/ie7-regex-issue-regex-that-work-in-every-browser-does-not-work-in-ie7) – rwyland

+0

¿Por qué no lo harán? dejarte borrar los comentarios ?? – Joe

3

No estoy seguro una sola expresión regular es el camino a seguir para esta prueba.

Personalmente me gustaría ponerlo en práctica algo como esto: (convite como pseudo código, yo no lo he probado)

function testPassword(pw) { 
    var len = pw.length; 
    if(len < 15) return false; 
    if(pw.replace(/[a-z]/,'').length > len - 2) return false; 
    if(pw.replace(/[A-Z]/,'').length > len - 2) return false; 
    if(pw.replace(/[0-9]/,'').length > len - 2) return false; 
    if(pw.replace(/[[email protected]#$%^&*-]/,'').length > len - 2) return false; 
    return true; 
} 
+0

pw.replace (/ [a-z]/** g **, '') .... – kennytm

+0

Sí, tenía algo en mente. +1 – Anders

+0

Me gusta su forma de pensar, pero necesito expresiones regulares porque funciona en varios idiomas, así que la clave para la reutilización del código fue clave para mí. – rwyland

0

Hay algunas buenas explicaciones ya, así que sólo estoy acumulando en .. .

/^
(?= .{15})
(?= (?:.*[[:lower:]]){2})
(?= (?:.*[[:upper:]]){2})
(?= (?:.*[[:digit:]]){2})
(?= (?:.*[[email protected]#$%^&*-]){2})
/x

Cuestiones relacionadas