¿Es esta una forma segura de generar contraseñas en la línea de comandos?

8

Ocasionalmente necesito generar una contraseña mientras trabajo en la línea de comandos de Unix. Tengo el siguiente alias en mi zshrc:

alias randpass='openssl rand -base64 32 | tr -d /=+ | cut -c -30'

Estos comandos generan una cadena de 30 caracteres alfanuméricos haciendo lo siguiente:

  1. Use OpenSSL para generar 32 bytes de datos aleatorios.
  2. Base64-codifica el resultado.
  3. Eliminar todos los caracteres excepto las letras mayúsculas, minúsculas y dígitos.
  4. Truncar el resultado a 30 caracteres.

El único defecto que puedo ver es que pueden quedar menos de 30 caracteres después de eliminar las instancias de / , = y + . Por supuesto, eso requeriría que estos tres símbolos formen más de un tercio de los caracteres codificados en base64, lo cual es increíblemente improbable.

¿La salida de "openssl rand" es lo suficientemente aleatoria como para usarla como base de contraseñas? ¿Hay algún tipo de sesgo introducido por la codificación en base64 de los bytes aleatorios? (Supongo que al eliminar / , = y + introduce un sesgo, pero esto es bastante mínimo).

    
pregunta bdesham 18.02.2015 - 22:52
fuente

1 respuesta

7

Puede aumentar el número de bytes a 45. Entonces se le garantiza que no se truncará el valor a menos de 30 bytes porque entonces al menos la mitad (30 caracteres) tendría que ser / , = o + para representar una cadena de menos de 30 caracteres.

Sí, es suficientemente aleatorio.

La codificación Base64 no introduce ningún sesgo, ya que solo los conviertes a otro formato base. Sigue siendo el mismo número exacto. El único pequeño sesgo introducido es eliminar / y + , lo que correspondería a eliminar cada aparición de 111110 y 111111 en la cadena, básicamente solo perdería 2 bits de entropía sobre una cadena que es Con una longitud de 180 bits, reduciría el valor aleatorio a 178 bits, que sigue siendo mucho mejor que una cadena SHA1 (la cantidad de contraseñas almacenadas), la clave MD5 o AES 128.

El carácter = es solo relleno y no tiene ningún valor significativo en una cadena base64.

    
respondido por el sebastian nielsen 19.02.2015 - 01:55
fuente

Lea otras preguntas en las etiquetas