unicode passwords normalization unicode-normalization text-normalization

¿Cómo implemento correctamente las contraseñas Unicode?



passwords normalization (2)

Agregar soporte para contraseñas Unicode es una característica importante que los desarrolladores no deben ignorar.

Aún así, agregar soporte para Unicode en las contraseñas es un trabajo complicado porque el mismo texto se puede codificar de diferentes maneras en Unicode y no se debe evitar que las personas inicien sesión debido a esto.

Digamos que almacenará las contraseñas como UTF-8 y que esta pregunta no está relacionada con las codificaciones Unicode y está relacionada con la normalización Unicode .

Ahora la pregunta es ¿cómo debería normalizar los datos Unicode?

Debes estar seguro de que podrás compararlo. Debe asegurarse de que cuando se publique el próximo estándar Unicode no invalide la verificación de su contraseña.

Nota: todavía hay algunos lugares donde las contraseñas Unicode probablemente nunca se utilizarán, pero esta pregunta no se trata de por qué o cuándo usar las contraseñas Unicode , se trata de cómo implementarlas de la manera adecuada.

Primera actualización

¿Es posible implementar esto sin usar la ICU, como usar el sistema operativo para normalizar?


Un buen comienzo es leer Unicode TR 15: Formas de normalización Unicode . Entonces te das cuenta de que es mucho trabajo y propenso a errores extraños, probablemente ya conozcas esta parte ya que estás preguntando aquí . Finalmente, descargue algo como ICU y deje que lo haga por usted .

IIRC, es un proceso de pasos múltiples. Primero descompones la secuencia hasta que no puedas descomponerla más, por ejemplo é se convertiría en e + ''. Luego, reordena las secuencias en un orden bien definido . Finalmente, puede codificar la secuencia de bytes resultante usando UTF-8 o algo similar. La secuencia de bytes UTF-8 se puede alimentar al algoritmo hash criptográfico de su elección y almacenar en una tienda persistente. Cuando desee verificar si una contraseña coincide, realice el mismo procedimiento y compare el resultado del algoritmo hash con lo que está almacenado en la base de datos.


Una pregunta para usted: ¿puede explicar por qué agregó "sin usar la UCI"? Veo muchas preguntas preguntando qué hace la UCI (creemos) bastante bien, pero "sin usar la UCI". Sólo curioso.

En segundo lugar, puede estar interesado en StringPrep / NamePrep y no solo en la normalización: StringPrep - para mapear cadenas para comparar.

En tercer lugar, puede estar interesado en UTR # 36 y UTR # 39 para otras implicaciones de seguridad de Unicode.

* (revelación: desarrollador de ICU :)