Esté de acuerdo con su análisis de que permitir símbolos permite mayor seguridad, pero generalmente no es mucho. Especialmente cuando se compara con usar contraseñas ligeramente más largas (suponiendo que la contraseña sea un símbolo elegido al azar). Usando cualquiera de los 95 caracteres ASCII imprimibles:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\]^_'{|} ~
(algunos más si cuenta los caracteres como tabulador o salto de línea como imprimible) una contraseña de 8 caracteres tiene 95 ^ 8 ~ 6.6 x 10 ^ 15 posibilidades, mientras que con solo letras y números (con mayúsculas y minúsculas) una contraseña de 8 caracteres tiene 62 ^ 8 ~ 2.2 x 10 ^ 14, que es aproximadamente 30 veces más débil.
Sin embargo, una contraseña de 9 caracteres con solo números + minúsculas + mayúsculas es dos veces más fuerte que una contraseña de 8 caracteres que permite caracteres especiales. Por lo tanto, a menos que haya límites estrictos en la longitud de una contraseña (y en realidad nunca es necesario que haya al menos contraseñas de menos de unos pocos cientos de caracteres), es fácil pasar a contraseñas ligeramente más largas incluso con un conjunto de caracteres limitado. / p>
La mayor preocupación potencial de seguridad es si creen que permitir caracteres especiales en las contraseñas podría causar problemas en su aplicación o base de datos. Existe una razón legítima para excluir los caracteres ASCII no imprimibles (por ejemplo, los caracteres de control ASCII NUL ( \b
), retroceso ( '
), etc.) que pueden causar problemas, pero las aplicaciones bien diseñadas deben poder manejarse caracteres especiales regulares como -
o A3
sin ser vulnerables a los ataques de inyección. Una aplicación debe poder manejar estos tipos de caracteres tal como aparecen, por ejemplo, en nombres con comillas o guiones (por ejemplo, Conan O'Brien, Daniel Day-Lewis). Además, como las contraseñas no deben guardarse en la base de datos ni devolverse nunca al usuario y simplemente se las debe eliminar, lo que no debería importar caracteres ASCII imprimibles.
Por supuesto, hay algunos problemas de usabilidad con caracteres especiales que no son ASCII como Unicode, y para problemas de usabilidad puede ser una buena idea prohibir estos caracteres o normalizarlos de manera estándar. Las funciones de hash normalmente esperan una cadena de bytes, y las contraseñas con caracteres especiales más allá de ASCII se pueden codificar de diferentes maneras en el nivel de bytes (por ejemplo, UTF-8, UTF-7, UTF-16, ISO-8859-1). Además, además de las diferentes codificaciones (que podría mantener consistentes en el nivel de la aplicación), también debe preocuparse por que las letras de aspecto idéntico tengan valores diferentes en Unicode. Por ejemplo, el siguiente carácter Å es unicode 00C5 , pero este carácter de aspecto idéntico es Å < a href="http://www.fileformat.info/info/unicode/char/212b/index.htm"> unicode 212B mientras que este Å es en realidad dos caracteres: un ascii A con un carácter de combinación de unicode 030a agregando un círculo sobre la A.
EDIT : acabo de notar que mencionaste £ como uno de tus símbolos comunes. Desafortunadamente, ese no es un símbolo ASCII estándar. En ISO-Latin-1, es el byte C2 A3
. En UTF-8 son los dos bytes +AKM-
. En UTF-7 son los caracteres ASCII 00 A3
. En UTF-16 es '
. Estas codificaciones diferentes significan que su función hash puede romperse en este carácter si no se maneja correctamente. Por supuesto, la aplicación debería poder manejar la codificación correctamente, pero podría fallar en algún subconjunto de dispositivos. Además, es posible que el carácter no esté disponible en teclados extranjeros.
También puede haber problemas de usabilidad con caracteres como "
o ‘’“”
que en algunas aplicaciones / plataformas pueden convertirse en comillas inteligentes %code% (aunque esto nunca debe hacerse en un contexto de contraseña).
Finalmente, hay una razón adicional para tener reglas de contraseña únicas: dificultar que los usuarios tengan una contraseña recordada que se reutiliza en todas partes, lo que es una práctica de seguridad horrible. Si la contraseña "normal" del usuario no cumple con las reglas únicas de un sitio, entonces cuando su contraseña normal se ve comprometida en otro sitio aleatorio (que dice que almacena la contraseña en texto sin formato), su cuenta no se compromete en el sitio con el único reglas.