Sign by Dealighted - Coupons and Deals

lunes, 22 de agosto de 2011

Generar numeros/caracteres de manera aleatoria en Linux con /dev/random

GNU/Linux

GNU/Linux fue el primer sistema operativo en implementar un generador de números aleatorios a nivel de sistema operativo. La implementación utiliza hashes seguros en lugar de cifrados, como se necesita para evitar restricciones legales que existían cuando el algoritmo fue diseñado originalmente. La implementación también fue diseñada bajo la premisa que cualquier hash o cifrado podría, eventualmente, ser débil por lo que el diseño es robusto frente a cualquiera de esas debilidades.

En estas implementaciones el generador mantiene un estimado del número de bits de ruido en la fuente de entropía. Desde esta fuente se crean los números aleatorios. Cuando son leídos, /dev/random sólo devolverá bytes aleatorios dentro del número estimado de bits de ruido en la fuente de entropía. /dev/random debería de ser adecuado para situaciones en las que se necesite aleatoriedad de alta calidad como podría ser el caso de generación de claves. Cuando la fuente de entropía está vacía, las lecturas de /dev/random se bloquearán hasta que ruido adicional del ambiente sea recogido.1

Una contraparte para /dev/random es /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.

También es posible escribir a /dev/random. Esto permite a cualquier usuario mezclar datos aleatorios a la fuente. Datos no aleatorios son inocuos porque sólo un usuario con los privilegios adecuados podrá utilizar ioctl para aumentar la estimación de entropía.

En marzo de 2006, Gutterman, Pinkas y Reinman publicaron un análisis criptográfico detallado del generador de números aleatorios de GNU/Linux2 en el que describen varias debilidades. Probablemente la más severa es en sistemas embebidos (routers) o aquellos que corren completamente en memoria como LiveCD o clientes sin almacenamiento físico, para los que el estado de arranque es predecible y la fuente de entropía disponible del ambiente es limitada. Para un sistema con memoria flash recomiendan guardar información del generador de números aleatorios en el momento de apagar el sistema de forma que pueda ser incluido al mismo en el próximo arranque. En caso de un router para el que el tráfico de la red representa la fuente primaria de entropía notan que guardar información cada vez que se lo reinicia "requeriría que atacantes potenciales se inmiscuyeran en todo el tráfico de la red" desde el momento en que se pone el router en servicio por primera vez, o bien, que tuviesen acceso directo al estado interno del router. Esto, notan, es particularmente crítico en el caso de un router inalámbrico en el que el tráfico de la red puede ser capturado a distancia y que puede estar utilizando el generador de números aleatorios para generar las claves de cifrado.

Una vez visto esto si intentamos leer el dispositivo /dev/urandom mediante un simple "cat" veremos que se muestra ante nuestros ojos mucho "ruido" y caracetres sin sentido... aparte de cuidado ya que se nos puede "corromper" la tty y tener q deslogarnos y volver a logarnos para "arreglarlo".

La manera efectiva de poder obtener esos numeros/caracteres sera mediante el uso del comando tr 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, o los numeros del 0-9.

El comando como tal nos quedaria asi:

tr -dc 0-9 < /dev/urandom | head -c 8 && echo

Donde tenemos el "0-9" podra se sustituido por A-Za-z o en su defecto combinado A-Za-z0-9 , con el comando head -c 8, indicaremos que debera de tener una longitud maxima de 8 cifras el numero generado.

Fuentes Wikipedia y El Rincon de Zerial

Gracias a ambas fuentes por la informacion aportada :D.

No hay comentarios: