Búsqueda de sitios web

javascript - Validación de contraseña con letras y números secuenciales - Expresión regular


Para tener las cuentas de los clientes más seguras, una contraseña bien elaborada es una buena práctica. Esta es mi cadena de Expresión Regular para la validación de contraseñas.

/^(?=.*[0-9])(?!.*?\d{3})(?=.*[a-zA-Z])(?!.*?[a-zA-Z]{3})(?=.*[~!@#$%^&*()+-?])([a-zA-Z0-9~!@#$%^&*()+-?]{8,})$/

Representa :

  • 8 o más caracteres.
  • Letra mayúscula A-Z
  • Letras minúsculas a-z
  • Caracteres especiales ~!@#$%^&*()+-?
  • ¿Para qué sirve esta función de Expresión Regular?: No debe contener hasta 3 letras y/o números secuenciales.

Tener números y/o letras en orden secuencial de 3 o más no está bien.

Ejemplo :

No OK=efg123!$, abcd567%, xyz789^&, #hijk23456
OK=ryiiu562@, erty745#, gjnfl45566^

Gracias

Respuesta #1

No hay manera de usar RegEx que yo conozca, pero aquí hay un enfoque funcional ingenuo.

Primero, recorre la cadena y compara cada carácter con los siguientes dos caracteres sumando +1 y +2 al índice actual y comparando adecuadamente.

En segundo lugar, recorre la cadena nuevamente y compara los siguientes dos caracteres con el carácter actual para ver si son secuenciales.

Si ambos bucles no logran encontrar caracteres secuenciales, la función devuelve verdadero; de lo contrario, devuelve falso.

Los primeros cuatro devuelven falso (fallan), mientras que los últimos tres devuelven verdadero (aprueban).

function test(s) {
    // Check for sequential numerical characters
    for(var i in s) 
        if (+s[+i+1] == +s[i]+1 && 
            +s[+i+2] == +s[i]+2) return false;
    // Check for sequential alphabetical characters
    for(var i in s) 
        if (String.fromCharCode(s.charCodeAt(i)+1) == s[+i+1] && 
            String.fromCharCode(s.charCodeAt(i)+2) == s[+i+2]) return false;
    return true;
}

// For demo purposes only
var tests = [
    'efg123!$',
    'abcd567%',
    'xyz789^&',
    '#hijk23456',
    'ryiiu562@',
    'erty745#',
    'gjnfl45566^'
], sep = '\t\u2192 ', out = ['Fail','Pass'], eol = '<br>';
document.write('<pre>');
for(var i in tests) document.write(tests[i] + sep + out[+test(tests[i])] + eol);
document.write('</pre>');

Respuesta #2

Este paquete es exactamente para eso: https://github.com/zxcvbn-ts/zxcvbn

zxcvbn es un evaluador de la fuerza de contraseñas inspirado en los descifradores de contraseñas. A través de la coincidencia de patrones y una estimación conservadora, reconoce y pondera 40 mil contraseñas comunes, nombres y apellidos comunes, palabras populares de Wikipedia y palabras comunes en diferentes idiomas de distintos países, y otros patrones comunes como fechas, repeticiones (aaa), secuencias (abcd), patrones de teclado (qwertyuiop) y lenguaje l33t.

Considera usar zxcvbn como una alternativa algorítmica a la política de composición de contraseñas: es más seguro, flexible y utilizable cuando los sitios requieren una puntuación mínima de complejidad en lugar de reglas molestas como "las contraseñas deben contener tres de {minúsculas, mayúsculas, números, símbolos}".

Más seguro: las políticas a menudo fallan en ambos sentidos, permitiendo contraseñas débiles (P@ssword1) y prohibiendo contraseñas fuertes. Más flexible: zxcvbn permite que muchos estilos de contraseñas prosperen siempre que detecte suficiente complejidad: las frases de contraseña se califican altamente si contienen suficientes palabras poco comunes, los patrones de teclado se clasifican según la longitud y el número de giros, y la capitalización agrega más complejidad cuando es impredecible. Más usable: zxcvbn está diseñado para alimentar interfaces simples, sin reglas, que proporcionan retroalimentación instantánea. Además de la estimación de la fortaleza, zxcvbn incluye retroalimentación verbal mínima y específica que puede ayudar a guiar a los usuarios hacia contraseñas menos predecibles. Para obtener más detalles y motivación, por favor consulte el artículo y la presentación de USENIX Security '16.

Este paquete también proporciona retroalimentación sobre cómo fortalecer la contraseña, y puedes establecer un nivel de contraseña requerido.

Si escribes expresiones regulares tú mismo, debes tener cuidado con ReDoS, y probablemente tampoco cubrirás todo...