¿Qué consideraciones de seguridad existen al desarrollar un generador de contraseñas aleatorias?

6

Me gustaría implementar un programa de creación de contraseña, similar a los proporcionados por Symantec y LastPass. Este programa permitirá al usuario simplemente especificar diferentes longitudes de contraseña y opciones.

¿Hay alguna consideración de seguridad que deba hacerse aparte de usar un generador de números pseudoaleatorios seguro criptográficamente adecuado en los algoritmos? Mi plan era usar algo como el RNGCryptoServiceProvider. "Generador de contraseñas aleatorias seguras" significa uno que, al menos, no tiene puerta trasera o es susceptible a fallas frívolas debido a una implementación incorrecta. Esta no es una aplicación en red.

Tenga en cuenta: no tengo la intención de "rodar mi propio" criptografía o hashing.

    
pregunta the_endian 13.03.2017 - 18:29
fuente

2 respuestas

5

Crear un generador de contraseñas seguro es bastante sencillo, siempre que tenga dos componentes:

  1. 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.

  2. 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.

    
respondido por el Lie Ryan 15.03.2017 - 03:13
fuente
2

La consideración principal para un generador de contraseñas es que no produce resultados predecibles. El punto de las contraseñas aleatorias es que el mejor ataque contra ellas es la fuerza bruta, pero si hay un sesgo, un atacante puede aprovechar para reducir su espacio de búsqueda.

En líneas similares, a menudo las personas quieren restricciones adicionales, como "pronunciable". Esto puede ser un beneficio de seguridad (puede recordar contraseñas en lugar de almacenarlas) así como un inconveniente (introducir sesgos, ver más arriba). Si estás interesado en esto, es importante tener mucho cuidado de no introducir sesgos adicionales en el algoritmo, ya que es un problema más complejo que simplemente generar caracteres aleatorios.

    
respondido por el Xiong Chiamiov 14.03.2017 - 06:23
fuente

Lea otras preguntas en las etiquetas