Linux (no así otros Unices) proporciona dos dispositivos virtuales
denominados /dev/random y /dev/urandom que pueden utilizarse para
generar números pseudoaleatorios, necesarios para aplicaciones
criptográficas. El primero de estos ficheros, /dev/random, utiliza lo
que su autor denomina `ruido ambiental' (por ejemplo, temporizadores de
IRQs, accesos a disco o tiempos entre pulsaciones de teclas) para crear
una fuente de entropía aceptable y - muy importante - que apenas
introduce sobrecarga en el sistema. El segundo archivo, /dev/urandom,
crea un resumen de la entropía de /dev/random utilizando la
función hash SHA (Secure Hash Algorithm), diseñada por el
NIST y la NSA para su Digital Signature Standard ([oST84]). Por
tanto, tenemos una fuente de entropía aceptable, /dev/urandom, y
otra incluso mejor, pero de capacidad limitada, /dev/random. Para detalles
concretos sobre su funcionamiento se puede consultar el fichero que las
implementa dentro del núcleo de Linux, drivers/char/random.c.
Como en el propio código se explica, cuando un sistema operativo arranca
ejecuta una serie de acciones que pueden ser predecidas con mucha facilidad
por un potencial atacante (especialmente si en el arranque no interactua
ninguna persona, como es el caso habitual en Unix). Para mantener el nivel de
entropía en el sistema se puede almacenar el desorden que existía
en la parada de la máquina para restaurarlo en el arranque; esto se consigue
modificando los scripts de inicialización del sistema. En el fichero
apropiado que se ejecute al arrancar (por ejemplo, /etc/rc.d/rc.M)
debemos añadir las siguientes líneas:
echo "Initializing random number generator..."
random_seed=/var/run/random-seed
# Carry a random seed from start-up to start-up
# Load and then save 512 bytes, which is the size of the entropy pool
if [ -f $random_seed ]; then
cat $random_seed >/dev/urandom
fi
dd if=/dev/urandom of=$random_seed count=1
chmod 600 $random_seed
Mientras que en un fichero que se ejecute al parar el sistema añadiremos lo
siguiente:
# Carry a random seed from shut-down to start-up
# Save 512 bytes, which is the size of the entropy pool
echo "Saving random seed..."
random_seed=/var/run/random-seed
dd if=/dev/urandom of=$random_seed count=1
chmod 600 $random_seed
Con estas pequeñas modificaciones de los archivos de arranque y parada del
sistema conseguimos mantener un nivel de entropía aceptable durante todo
el tiempo que el sistema permanezca encendido.
Si de todas formas no consideramos suficiente la entropía proporcionada
por estos dispositivos de Linux, podemos conseguir otra excelente fuente de
desorden en el mismo sistema operativo a partir de una simple tarjeta de sonido y unas modificaciones en el núcleo ([Men98]), o utilizar alguno de
los generadores - algo más complejos - citados en [Sch94].
© 2002 Antonio Villalón Huerta