Puede haber problemas con los caracteres que no son ASCII. Una contraseña es una secuencia de glifos, pero el procesamiento de la contraseña (hashing) necesitará una secuencia de bits , por lo que debe haber una forma determinista de transformar los glifos en bits. Este es todo el pantano turbio de páginas de códigos . Incluso si te mantienes en Unicode , hay problemas en curso:
-
Un solo carácter puede tener varias descomposiciones como puntos de código. Por ejemplo, el carácter "é" (que es muy frecuente en francés) puede codificarse como un único punto de código U + 00E9, o como la secuencia U + 0065 U + 0301; ambas secuencias están destinadas a ser equivalentes. Si obtiene uno u otro depende de las convenciones utilizadas por el dispositivo de entrada.
-
Una cadena Unicode es una secuencia de puntos de código (que son enteros en el rango de 0 a 1114110). Hay varias codificaciones estándar para convertir tal secuencia en bytes; los más comunes serán UTF-8, UTF-16 (big-endian), UTF-16 (little-endian), UTF-32 (big-endian) y UTF-32 (little-endian). Cualquiera de estos puede o no comenzar con una BOM .
Por lo tanto, una sola "é" se puede codificar de manera significativa en bytes con al menos veinte variantes distintas, y eso es cuando se adhiere a "Unicode convencional". codificación Latin-1 , o su homólogo de Microsoft , también está muy extendido, así que haga que 21. La codificación que utilice una determinada pieza de software pueda depender de muchos factores, entre ellos el locale . Es molesto cuando el usuario ya no puede iniciar sesión en su computadora porque cambió la configuración de "Canadian - English" a "Canadian - French".
Experimentalmente , la mayoría de los problemas de ese tipo se evitan restringiendo las contraseñas al rango de ASCII imprimible caracteres (aquellos con códigos que van del 32 al 126 - personalmente evitaría el espacio, así que haga que 33 a 126) y aplique la codificación mono-byte (sin BOM, un carácter se convierte en uno byte). Dado que las contraseñas deben escribirse en varios teclados sin retroalimentación visual, la lista de caracteres debería ser aún más restringida para una usabilidad óptima (lucho diariamente con diseños canadienses donde lo que está escrito en el teclado no coincide necesariamente con lo que la máquina cree que es, especialmente cuando se pasa por uno o dos anidados conexiones RDP ; los caracteres '<', '>' y '\' se mueven con mayor frecuencia). Con solo letras (mayúsculas y minúsculas) y dígitos, estarás bien.
Se podría decir que el usuario es responsable; es libre de usar los caracteres que desee siempre que se ocupe del problema de escribirlos. Pero eso no es en última instancia sostenible: cuando los usuarios tienen problemas, llaman a su servicio de asistencia, y usted tiene que asumir parte de sus errores.