¿Cómo debo generar contraseñas aleatorias de forma segura al importar nuevos usuarios?

2

Necesito generar contraseñas aleatorias al importar nuevos usuarios desde una fuente externa. Actualmente lo estoy haciendo tomando un surtido aleatorio de 8 letras en minúsculas / mayúsculas y números. También estoy usando el rand de Ruby como PRNG. ¿Es esto criptográficamente seguro?

    
pregunta 123 22.05.2017 - 16:14
fuente

8 respuestas

8

En primer lugar, debe usar un generador seguro de números aleatorios, como Ruby SecureRandom .

En segundo lugar, debe elegir un nivel de seguridad de destino para las contraseñas generadas, es decir, ¿qué tan difícil debería ser descifrarlas? Los niveles de seguridad a menudo se dan en bits , es decir, el logaritmo base 2 del número de contraseñas equiprobable distintas. En palabras más simples:

  • Un nivel de seguridad de 64 bits significa que hay 2 ^ 64 contraseñas distintas, y su sistema es tan probable que elija una como cualquiera de las demás;
  • Un "surtido aleatorio de 8 letras minúsculas / mayúsculas y números" tiene 62 caracteres distintos, lo que significa que elegir uno de esos caracteres al azar proporciona log2 (62) ≈ 6 bits de seguridad. La elección de 8 caracteres independientes al azar proporciona log2 (62) * 8 ≈ 48 bits de seguridad.

48 bits es crackable en la práctica para un atacante realmente dedicado; Recomendaría un nivel de seguridad de 64 bits como mínimo para las contraseñas, y prefiero unos 80 bits para los míos. Con letras en mayúsculas / minúsculas + dígitos, necesita 11 caracteres aleatorios para un nivel de seguridad de 64 bits, y 13 caracteres le da un nivel de seguridad de 78 bits.

Antes de editar una pregunta, le preguntamos sobre el efecto de agregar símbolos a sus contraseñas, además de aumentar el tamaño del alfabeto a aproximadamente 95 caracteres y log2 (95) ≈ 6.6, lo que reduce el tamaño de las contraseñas en un carácter: 10 caracteres para una contraseña de 64 bits y 12 para una contraseña de 79 bits. Si está generando contraseñas al azar, puede ver que no es un gran efecto.

    
respondido por el Luis Casillas 22.05.2017 - 19:37
fuente
5
  

8 letras minúsculas / mayúsculas y números

Esto es lo mínimo para una política de contraseña débil. Especialmente 8 caracteres no son suficientes.

A medida que genera sus contraseñas, ¿por qué restringirse a contraseñas que son bastante débiles y fácilmente forzadas por la ley bruta? Sugeriría al menos 64bits , pero realmente no hay una buena razón para no ir con 128/160, lo cual ser más seguro.

También tendrá el problema de distribuir las contraseñas, que probablemente serán inseguras (¿probablemente un correo electrónico?).

Debido a esto, sugeriría encarecidamente que estas contraseñas de un solo uso que el usuario debe cambiar después del siguiente inicio de sesión correcto (por lo que básicamente se convierta en un token de restablecimiento de contraseña).

    
respondido por el tim 22.05.2017 - 16:31
fuente
4

En Ruby, simplemente puedes usar SecureRandom.hex para las contraseñas aleatorias que el usuario necesita cambiar.

[1] pry(main)> require 'securerandom'
=> true
[2] pry(main)> SecureRandom.hex
=> "c3c4fe04dcc0d388fa37fc5991423a5d"
[3] pry(main)> 

Utiliza el generador de números aleatorios seguro provisto por el sistema operativo, mientras que la función rand() es un Mersenne Twister (fácil de predecir una vez que vea la salida).

La longitud predeterminada también está perfectamente bien.

    
respondido por el Riking 22.05.2017 - 18:35
fuente
2

La forma en que lo haces generalmente está bien.

Asegúrate de usar un generador de números aleatorios seguro. Algunos PRNG crean resultados predecibles, lo que hace posible adivinar la contraseña de otro usuario por mi cuenta.

Cuantos más resultados posibles tenga su algoritmo, más segura será la contraseña. Esto significa que cuanto más larga sea la contraseña, más segura será. Sin embargo, una contraseña más larga también será más difícil de escribir para el usuario. Usas ocho caracteres, que es un poco bajo. Recomiendo al menos 10 caracteres.

De la misma manera, incluir caracteres de puntuación aumenta un poco la seguridad.

Para hacer que las contraseñas sean más fáciles para sus usuarios, es posible que desee eliminar caracteres que se parezcan, como 0, o y O. También hay algoritmos que crean contraseñas algo recordables, como "NaughtyChopstick21 @". Sin embargo, a menudo es mejor si los usuarios usan un administrador de contraseñas o crean ellos mismos una contraseña segura y memorable.     

respondido por el Sjoerd 22.05.2017 - 16:23
fuente
1

Sus requisitos de contraseña podrían ser mejores, pero probablemente funcionarán como una contraseña temporal. Me preocuparía más cómo va a distribuir esas contraseñas. Probablemente por correo electrónico? Si usted es , es muy inseguro. Si sigue esta ruta, debe permitir que las contraseñas se usen solo una vez.

rand no es criptográficamente seguro. Me gustaría utilizar sysrandom .

    
respondido por el Abe Miessler 22.05.2017 - 18:04
fuente
0

Para las contraseñas generadas aleatoriamente hay dos medidas importantes:

  • Haz que la entropía de la contraseña sea lo suficientemente alta
  • Hazlo lo más fácil de usar posible.

Debe decidir cuántos bits de seguridad es necesario. 8 caracteres alfanuméricos no proporcionan suficiente entropía, hay dos maneras de mejorar eso:

  • Utilice un conjunto más grande de caracteres posibles
  • Usa una contraseña más larga

Hacer que la contraseña sea más larga es el más eficiente de los dos para aumentar la entropía de sus contraseñas. También es el enfoque más fácil de usar porque cuanto más diferentes sean los caracteres, más difícil será escribirlos. E incluso si el usuario no los escribe, los caracteres más diferentes también harán que la contraseña sea más difícil de copiar y pegar y es más probable que provoque problemas de interoperabilidad.

Diría que ya has ido demasiado lejos al utilizar todos los caracteres alfanuméricos. Para que sea más fácil de usar, recomendaría seguir con letras minúsculas. Y para hacerlo seguro, recomendaría que la contraseña sea lo suficientemente larga.

Suponga que su objetivo de seguridad es de 64 bits, puede ir con:

  • 14 caracteres minúsculos aleatorios
  • 10 caracteres aleatorios de todos los caracteres ASCII imprimibles

El inconveniente de tener que lidiar con todos los caracteres especiales es mucho peor para el usuario que el inconveniente de que la contraseña generada tenga 4 caracteres más.

    
respondido por el kasperd 22.05.2017 - 22:15
fuente
0

Con cualquier sistema de contraseñas y seguridad, realmente tiene que considerar más que solo la longitud / aleatoriedad de la contraseña, es realmente más importante pensar en cómo serán atacados.

Hay dos formas de atacar las contraseñas

  • Fuerza bruta en línea . Aquí el atacante está atacando la contraseña del usuario a través de su sistema. A menos que su usuario haya elegido una contraseña que pueda adivinar antes de que se inicie el bloqueo de la cuenta, el atacante no logrará ingresar. En general, es probable que no se adivinen caracteres aleatorios en este escenario. Lo importante que debe hacer aquí es asegurarse de que su sistema bloquee a los atacantes y trate de asegurarse de que los usuarios no elijan contraseñas muy comunes como 123456.

  • Fuerza bruta sin conexión Aquí el atacante tiene una copia de su base de datos de contraseñas (probablemente a través de una falla como la Inyección SQL, si es un sistema basado en la web) y está tratando de descifrar la contraseñas Probablemente el control más importante aquí es qué algoritmo está utilizando para almacenar las contraseñas. Aquí me referiré a Thomas Pornin para explicar las opciones pero vale la pena señalar que Ruby tiene un soporte de biblioteca decente para bcrypt (Rails lo usa para SecurePassword). La longitud de la contraseña también es importante aquí, al igual que la aleatoriedad, pero descifrar las contraseñas generalmente aleatorias de 8 caracteres con bcrypt y un factor de trabajo decente, no es algo trivial para la mayoría de los atacantes. Sin conocer tu modelo de riesgo, no puedo decir que esté bien, pero tampoco lo veo tan mal.

En su opinión sobre la seguridad criptográfica, como han dicho otros, ruby SecureRandom es mejor que Rand

    
respondido por el Rоry McCune 22.05.2017 - 22:35
fuente
0

En su lugar, use frases generadas aleatoriamente de cinco palabras. Puedes adaptar la lista de palabras encontrada aquí:

enlace

Haga que todos estén en minúscula: fáciles de escribir, fáciles de memorizar si es necesario.

    
respondido por el Royce Williams 28.05.2017 - 04:14
fuente

Lea otras preguntas en las etiquetas