Crear un generador de contraseñas seguro es bastante sencillo, siempre que tenga dos componentes:
-
Un RNG criptográficamente seguro. Esto significa que la salida del RNG es un flujo de bits que no debe ser predecible bajo ninguna condición. Sin embargo, en la mayoría de los casos, solo puede usar un PRNG diseñado específicamente para la generación de claves como / dev / urandom, / dev / random o CryptGenRandom. PRNG regular como Mersenne Twister no debe usarse para la generación de claves. No debe intentar escribir su propio CSPRNG a menos que tenga una gran experiencia en matemáticas CSPRNG. Esta es la parte en la que la mayoría de las "personas normales que desarrollan generadores de contraseñas" a menudo no prestan suficiente atención.
-
Un algoritmo de codificación uno a uno. Este algoritmo codifica el flujo de bits producido por el RNG en algo aceptable por el sistema que necesita usar la contraseña y, para la contraseña memorizable, la preferencia del usuario. Una codificación uno a uno es una función que no tiene colisiones de salida para sus entradas, por lo que la función no pierde ninguna entropía producida por el RNG durante la codificación. Esta es la parte que es realmente extremadamente fácil, pero la mayoría de las "personas normales que desarrollan generadores de contraseñas" a menudo se complican innecesariamente y terminan debilitando su método de generación de contraseñas.
Ejemplo de algoritmo de codificación uno a uno: Diceware, base64, codificación hexadecimal, cualquier función hash perfecta . Ejemplo de algoritmo de transformación no adecuado para la generación de contraseñas: el algoritmo hash más habitual.
Una vez que tenga estos dos componentes, todo lo que debe hacer es pedirle al CSPRNG un flujo de bits de longitud n, donde n es la fuerza requerida de su contraseña, y codificar ese flujo de bits utilizando el algoritmo de codificación seleccionado.
Pitfall: debe parametrizar el algoritmo de codificación para que nunca pueda producir una contraseña que sería rechazada por la política de contraseña del sistema de destino. Si simplemente rechaza una contraseña y la genera nuevamente utilizando un valor aleatorio diferente, está reduciendo la entropía. En teoría, esto significa que tendrá que conocer los detalles exactos de la política de contraseña de cada sistema que necesita generar para calcular correctamente la seguridad de su contraseña. En la práctica, a menudo puede simplemente agregar un poco más de fuerza de bits para compensar la pérdida de entropía debido a una política de contraseña tan complicada.
Pitfall: para contraseñas memorizables, el usuario debe ser entrenado para no rechazar cualquier contraseña que encuentre difícil de memorizar, ya que esto también reduce la entropía. Esto significa que el codificador de contraseña memorizable debe diseñarse tanto como sea posible para que produzca las contraseñas / paráfrasis que es más probable que el usuario acepte en el primer intento. Hay pocos algoritmos de codificación que intentan esto, por ejemplo, EFF Diceware wordlist o gramatical Diceware.