¿Está bien normalizar las contraseñas de Unicode con NFC / NFD?

8

Actualmente estoy diseñando un inicio de sesión para un servicio web. Usaré una implementación PBKDF2 para cifrar las contraseñas.

Sin embargo, tengo la intención de permitir Unicode para las contraseñas, ya que tendré usuarios internacionales, que tal vez desee utilizar, por ejemplo, caracteres cirílicos. Para evitar cualquier problema con la ambigüedad de Unicode, pensé en usar la normalización de Unicode de NFC antes de codificar la contraseña como utf8 y pasarla al hash.

La pregunta ahora es: ¿es seguro o introduce alguna ambigüedad no deseada en la validación de la contraseña? Está claro que "a\u0308" (a + diaresis combinada) y "ä" deberían ser iguales, pero ¿la NFC dobla más diferencias en las que los usuarios podrían confiar?

Editar :

Encontré que hay un perfil stringprep ( RFC 3454 ) llamado SASLprep (RFC 4013) que aparentemente se usa para contraseñas y nombres de usuario en algunos protocolos. Especifica usar una normalización KD, lo que considero una mala idea. Doblará las diferencias como ² y 2 , que son dos caracteres comúnmente en los keybords en el mundo occidental al menos, que podrían usarse para enriquecer la entropía de la contraseña. Desafortunadamente, no se dan razones para eso.

    
pregunta Jonas Schäfer 20.02.2014 - 19:05
fuente

1 respuesta

4

Si trata 2 y ² como el mismo carácter, básicamente está eliminando un carácter del conjunto de caracteres. Eso no es realmente tan malo si aumenta la facilidad de uso, especialmente si alienta contraseñas más largas.

Supongamos que toma una contraseña de 8 caracteres, con un trazado aleatorio de un conjunto de 2000 caracteres. Eso da log₂ (2000⁸) ≈ 88 bits de entropía. Si tenía una contraseña de 9 caracteres, extraída de 1000 caracteres (¡la mitad!), Eso es log₂ (1000⁹) ≈ 90 bits de entropía. De hecho:

+-----+---------------------------+
|     |    character set size     |
| len |  500 | 1000 | 2000 | 4000 |
|-----+------+------+------+------|
| 6   |  54  |  60  |  66  |  72  |
| 7   |  63  |  70  |  77  |  84  |
| 8   |  72  |  80  |  88  |  96  |
| 9   |  81  |  90  |  99  |  108 |
| 10  |  90  |  100 |  110 |  120 |
| 11  |  99  |  110 |  121 |  132 |
+---------------------------------+

Como puede ver, en el rango normal de longitudes de contraseña y tamaños de conjuntos de caracteres de Unicode, el tamaño exacto del conjunto de caracteres no es tan importante.

    
respondido por el derobert 25.02.2014 - 23:11
fuente

Lea otras preguntas en las etiquetas