Creación de passwords aleatorias con /dev/urandom

/dev/random es un archivo especial que sirve como un generador de números aleatorios, o un generador de números seudo-aleatorios. Permite el acceso a ruido ambiental recogido de dispositivos y otras fuentes […] /dev/urandom que reutiliza la fuente interna para producir más bits seudoaleatorios. Esto implica que llamadas de lectura nunca se bloquearán, pero la salida puede contener menos entropía que una lectura de /dev/random. La intención es servir como un generador de números seudoaleatorios criptográficamente seguro. Éste puede ser utilizado en aplicaciones que no necesiten de tanta seguridad. (Wikipedia)

Para generar password aleatorias usaremos una combinación de los comandos tr y head, para poder hacer legible para humanos los bits aleatorios que nos entregará urandom.

Si hacemos un cat directamente a /dev/urandom solamente vamos a ver caracteres raros

Para “traducir” estos bits aleatorios a caracteres legibles por nosotros usaremos translate.

De esta forma, le decimos a tr que nos interprete los bits en caracteres de la A a la Z (mayúscula). Podemos jugar con el juego de caracteres que queremos obtener, por ejemplo decirle que me muestre letras de la a-z y A-Z

Tambien podemos decirle que nos muestre números y caracteres como guión o guión bajo. El comando final quedaria de la siguiente forma:

tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8

Con head -c 8 le diremos que nos muestre solo los primeros 8 caracteres. Podemos cambiar su valor si deseamos caracteres de mayor o menor longitud. Al final de la linea podemos agregarle un && echo “” para que nos muestre un salto de linea al final.

[zerial@balcebu ~]$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 && echo Z2_gaCcE [zerial@balcebu ~]$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 && echo Tob68gN0 [zerial@balcebu ~]$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 && echo boEzFU3O [zerial@balcebu ~]$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 && echo EFfcRcuf [zerial@balcebu ~]$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 && echo cTY330uO [zerial@balcebu ~]$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 && echo l3UnaDPo [zerial@balcebu ~]$

O una forma más elegante:

$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 | xargs

6 comentarios

  1. Zerial, muy bueno el artículo. Creo que es una forma sencilla de crear contraseñas de cierta seguridad. No obstante, quisiera remarcar que aunque sivan para usos “cotidianos” (e.g., el webmail), este método no debería usarse para contraseñas de seguridad críticas (en especial cuando la longitud debe ser bastante superior a 8 caracteres, que además deberíamos leer de /dev/random). Con esto quiero decir que /dev/random y /dev/urandom no garantizan una seguridad superior a 256 bits, o lo que es lo mismo 16 bytes. Para generar contraseñas que requieran más de 16 bytes de longitud, deberíamos usar un PRNG (generador de números pseudo-aleatorios) cuya semilla (también llamada seed) provenga de una lectura de /dev/random o /dev/urandom.

    Hecha esa acotación, los comandos utilizados muestran mucha elegancia :). Y reitero lo de arriba: para usos cotidianos es seguro.

  2. Cual es la diferencia entre usar random, urandom y rand() de c++? Si quiero obtener los numeros mas aleatorios cual deberia elegir?

  3. La diferencia entre urandom y random es que el primero no bloquea porque reutiliza las mismas fuentes de entropia. rand() de C/C++ utiliza la biblioteca estandar.

    /dev/{ur,r}andom estan pensados para usarse, no como fuentes de numeros aleatorios (esta en mi comentario de mas arriba) sino para usarse como semilla de un generador de numeros aleatorios. Esto es asi porque no garantizan mas de 256 bits de aleatoreidad.

    Dicho esto, lo mas seguro es usar las funciones de numeros aleatorios OpenSSL, por ejemplo, o usar rand(), que no es tan seguro, con una semilla leida de /dev/urandom.

    /dev/random no deberia usarse salvo para gnenerar valores que deben ser verdaderamente aleatorios, como para generar claves, etcetera.

    Para los numeros mas aleatorios, de

  4. Ricardo: Gracias por tu explicación! Hasta a mi me quedó más claro!

    saludos

  5. Cuando suplo urandom por random mi sistema se queda “quieto”; no sucede algo similar en el shell como cuando estoy llamando a urandom (lo único que pasa es que el HDD se pone a trabajar).
    ¿Podrías explicarme porqué?
    ¡Tienes un “sitio” de fabula!, felicidades….

  6. Hola Caffeine!

    Como dice Ricardo en el comentario de mas arriba:

    “La diferencia entre urandom y random es que el primero no bloquea porque reutiliza las mismas fuentes de entropia.”

    Si te fijas, al hacer “cat /dev/random” no obtienes lo mismo que “cat /dev/urandom””

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Esto sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.