Todos los artículos sobre seguridad de contraseñas que leo le dicen a las personas que hagan más complicada la contraseña utilizando una gama más amplia de caracteres. Dicen que no solo use a-z, sino que también mezcle algunos A-Z, números 0-9 y algunos signos de puntuación. Básicamente utiliza todos los caracteres de tu teclado. Sin embargo, estoy creando sitios web diseñados para un público que no habla inglés. Específicamente los usuarios chinos. Me he dado cuenta de que muchos sitios web chinos también piden que las contraseñas se realicen utilizando el mismo conjunto de caracteres. Me quedo con un acertijo sobre por qué limitarme solo al conjunto básico de ascii. ¿Por qué no utilizar caracteres chinos u otros caracteres de guión?
Por ejemplo, en lugar de usar "! 0 *% y6 #! 7N @ 6", el usuario podría usar "胜 0 屿% y6 #! 7N 景 6", que es de la misma longitud pero significativamente más complejo.
Mi aplicación está construida en UTF-8 y es compatible con scripts chinos y otros complejos. Por lo tanto, no hay ningún problema de programación para permitir caracteres complejos en las contraseñas.
Al ampliar el posible conjunto de caracteres de contraseñas para incluir caracteres chinos, japoneses, coreanos y árabes, puedo aumentar la entropía de las contraseñas a niveles increíblemente altos sin hacer que la contraseña sea más larga o más difícil de recordar. De hecho, puede ser más fácil para mis usuarios chinos recordar una contraseña china que una en inglés. Sería muy improbable que alguien pudiera usar fuerza bruta o usar una tabla arco iris para descifrar la contraseña.
Puedo entender los límites del conjunto de caracteres en los usuarios occidentales donde los caracteres utilizados son todos los de un teclado y es bastante incómodo ingresar un carácter que no esté en su teclado. Sin embargo, los usuarios chinos tienen herramientas en su sistema para ingresar el conjunto completo de caracteres chinos, por lo que no hay problema para ellos allí.
Así que para hacer la pregunta en breve. ¿Existe algún problema de seguridad que permita a los usuarios crear contraseñas de caracteres más allá del conjunto de teclado normal?
Para expandir y responder el punto de AviD a continuación:
Cuando se ingresa una contraseña, no permanece como caracteres sino que se convierte en una secuencia de bits. Estos bits son la contraseña real. El proceso de convertir caracteres a bits es la codificación de caracteres. ASCII es una de esas codificaciones, aunque ahora es bastante antigua y de tamaño limitado. Otro común es Unicode, que ha evolucionado en la codificación UTF-8 que la mayoría de los sitios web se recomienda usar en la actualidad.
Unicode y UTF-8 son compatibles con ASCII, por lo que cualquier contraseña basada en ASCII sería la misma en bits, sin importar qué codificación se usó cuando se ingresó la contraseña. Sin embargo, hay algunas formas de codificación que siguen siendo populares y que no son compatibles con muchas otras que no son compatibles con Unicode o UTF-8. Estos incluyen sistemas de codificación como Big5 (usado en Tiawan y Hong Kong) y GB usados en China continental.
Si alguien ingresó su contraseña en una computadora un día en una codificación y otro día en otra codificación, la secuencia de bits enviada como la contraseña sería diferente.
Es posible detectar el sistema de codificación y convertirlo en el lado del servidor. Mis aplicaciones ya lo hacen, convirtiendo todo lo que se ingresa en UTF-8. Sin embargo, me pregunto qué tan perfecta es esa conversión. ¿Big5 convertido a UTF-8 daría el mismo resultado que GB convertido a UTF-8?
Además, hay algunos ataques XSS basados en codificación de caracteres que utilizan la codificación y el manejo de caracteres descuidados como su vector. ¿Podría usarse algo similar para comprometer las contraseñas de los usuarios o mi aplicación en la que no se colocan límites, o muy pocos, sobre qué caracteres se pueden imputar?