random(4) Device Drivers Manual random(4)

random, urandom - dispositivos del núcleo para generar números aleatorios

#incluir <linux/random.h>
int ioctl(fd, RNDsolicitud, param);

Los archivos especiales /dev/random y /dev/urandom (presentes desde la versión 1.3.30 de Linux) proporcionan una interfaz con el generador de números aleatorios del núcleo. El archivo /dev/random tiene 1 como número mayor de dispositivo y 8 como número menor de dispositivo. El fichero /dev/urandom tiene 1 como número mayor de dispositivo y 9 como número menor de dispositivo.

El generador de números aleatorios recoge el ruido ambiental procedente de los drivers de dispositivos y otras fuentes y lo guarda en un 'pool de entropía'. El generador también mantiene una estimación del número de bits de ruído de dicho pool. Los números aleatorios se crearán en base a este pool.

Linux 3.17 y posteriores proporcionan una interfaz getrandom(2) más sencilla y segura que no requiere archivos especiales; consulte la página del manual getrandom(2) para obtener más detalles.

Durante su lectura, el dispositivo /dev/urandom muestra bytes aleatorios creados por un generador de números pseudoaleatorios basado en el pool de entropía. No se crea ningun bloqueo durante la lectura de este dispositivo, no se libera la CPU, pero pueden darse retrasos apreciables si se solicitan grandes cantidades de datos.

Cuando se lee justo durante el inicio del equipo, pueden generarse datos antes de iniciarse el pool de entropía. Si se considera esto un inconveniente, utilice en su lugar getrandom(2) o /dev/random.

El dispositivo /dev/random es una interfaz antigua de una época en la que las primitivas criptográficas utilizadas en la implementación de /dev/urandom no eran demasiado fiables. Creará bytes aleatorios solo dentro del número estimado de bits de ruido nuevo en el pool de entropía, bloqueándolos si necesario. /dev/random es adecuado para aplicaciones que necesitan aleatoriedad de alta calidad y pueden permitirse retrasos indeterminados.

Cuando el pool de entropía esté vacío, se bloqueará la lectura de /dev/random hasta que se recopile ruido ambiental adicional. Desde Linux 5.6, el indicador O_NONBLOCK se ignora ya que /dev/random ya no se bloqueará excepto durante el comienzo del inicio del equipo. En versiones anteriores, si se llama a open(2) para /dev/random con el indicador O_NONBLOCK, un read(2) posterior no se bloqueará si el número de bytes solicitado no está disponible sino que se devuelven los bytes disponibles. Si no hay ningún byte disponible, read(2) devolverá -1 y errno se establecerá en EAGAIN.

El indicador O_NONBLOCK no tiene efecto al abrir /dev/urandom. Al llamar a read(2) para el dispositivo /dev/urandom, las solicitudes de hasta 256 bytes devolverán tantos bytes como se soliciten y no serán interrumpidas por ningún controlador de señales. Las lecturas con un búfer por encima de este límite pueden devolver una cantidad menor del número de bytes solicitado o fallar con el error EINTR, si son interrumpidas por un controlador de señal.

Desde Linux 3.16, un read(2) de /dev/urandom retornará un máximo de 32 MB. Un read(2) de /dev/random devolverá un máximo de 512 bytes (340 bytes en versiones anteriores de Linux 2.6.12).

Al escribir en /dev/random o /dev/urandom se actualiza el pool de entropía con esos datos escritos, pero esto no dará un recuento de entropía más alto. Afectará al contenido leído de ambos archivos, pero no hará que las lecturas de /dev/random sean más rápidas.

La interfaz /dev/random se considera una interfaz heredada y /dev/urandom es la preferida en todos los casos, con la excepción de aplicaciones que requieren aleatoriedad durante el comienzo del inicio del equipo. Dichas aplicaciones, deberán usar getrandom(2) en su lugar, porque se bloquearán hasta que se inicialice el pool de entropía.

Si se guarda un archivo semilla entre los reinicios como se recomienda a continuación, la salida será criptográficamente segura contra atacantes sin privilegios de administrador tan pronto como se recarga en la secuencia de inicio, y es perfectamente adecuada para su uso en las claves de sesión de cifrado de red. Las principales distribuciones de Linux guardan dicho archivo semilla desde, al menos, el año 2000. Dado que las lecturas de /dev/random pueden bloquearse, los usuarios normalmente querrán abrirlo en modo sin bloqueo (o realizar una lectura con tiempo de espera). y proporcionar algún tipo de notificación al usuario si la entropía deseada no está disponible de inmediato.

Si en su sistema no existen todavía /dev/random y /dev/urandom, puede crearlos con las siguientes órdenes:


mknod -m 666 /dev/random c 1 8
mknod -m 666 /dev/urandom c 1 9
chown root:root /dev/random /dev/urandom

Cuando un sistema Linux arranca sin mucha interación del operador, el pool de entropía puede estar en un estado bastante predecible. Esto reduce la cantidad actual de ruido en el pool de entropía por debajo de lo recomendado. Para contrarestar este efecto, es posible conservar la información del pool de entropía entre los reinicios del sistema. Para hacer esto, añada las líneas a un script de shell adecuado que se ejecute durante la secuencia de inicio:


echo "Iniciando generador de números aleatorios..."
random_seed=/var/run/random-seed
# Guarda una semilla entre reinicios del sistema
# Carga y guarda todo el pool de entropía
if [ -f $random_seed ]; then
    cat $random_seed >/dev/urandom
else
    touch $random_seed
fi
chmod 600 $random_seed
poolfile=/proc/sys/kernel/random/poolsize
[ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096
bytes=$(expr $bits / 8)
dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

También, añada las siguientes líneas a un guión shell apropiado que se ejecute durante la parada del sistema Linux:


# Guarda una semilla de aleatoriedad cuando se apaga el sistema
# Guarda todo el pool de entropía
echo "Guardando semilla de entropía..."
random_seed=/var/run/random-seed
touch $random_seed
chmod 600 $random_seed
poolfile=/proc/sys/kernel/random/poolsize
[ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096
bytes=$(expr $bits / 8)
dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

En los ejemplos anteriores, se supone Linux 2.6.0 o posterior, donde /proc/sys/kernel/random/poolsize devuelve el tamaño del pool de entropía en bits (ver a continación).

Los archivos en el directorio /proc/sys/kernel/random (presente desde Linux 2.3.16) proporcionan información adicional sobre el dispositivo /dev/random:

Este archivo de sólo lectura proporciona la entropía disponible, en bits. Ésta será un número en el intervalo de 0 a 4096.
Este archivo proporciona el tamaño del pool de entropía. El formato de este archivo varía según las versiones del kernel:
Este archivo proporciona el tamaño del pool de entropía en bytes. Normalmente, este archivo tendrá el valor 512, pero es posible escribir en él y se puede cambiar a cualquier valor para el cual haya un algoritmo disponible. Las opciones son 32, 64, 128, 256, 512, 1024 o 2048.
Este archivo es de sólo lectura y proporciona el tamaño del pool de entropía en bits. Contiene el valor 4096.
Este archivo contiene los bits de entropía necesarios para reactivar procesos en pausa esperando entropía de /dev/random. El valor predeterminado es 64.
Este archivo contiene la cantidad de bits de entropía por debajo de los cuales se activan procesos que hacen un select(2) o poll(2) para acceso de escritura a /dev/random. Estos valores se pueden modificar escribiendo en los archivos.
Estos archivos de solo lectura contienen cadenas aleatorias como 6fw3a24b-31f4-4bd4-a9b9-6b9be13e1fe9. El primero se genera de nuevo para cada lectura, el segundo se genera sólo una vez.

Las siguientes solicitudes ioctl(2) se definen en descriptores de archivos conectados bien a /dev/random o a /dev/urandom. Todas las solicitudes realizadas interactuarán con el pool de entropía de entrada, lo que afectará tanto a /dev/random como a /dev/urandom. La capacidad CAP_SYS_ADMIN es necesaria para todas las solicitudes salvo para RNDGETENTCNT.

Recupera el recuento de entropía del pool de entrada; el contenido será el mismo que el del archivo entropy_avail en proc. El resultado se almacenará en el int señalado por el argumento.
Incrementa o disminuye el recuento de entropía del pool de entrada por el valor señalado en el argumento.
Eliminado en Linux 2.6.9.
Agrega algo de entropía adicional al grupo de entrada, incrementando el recuento de entropía. Es diferente a escribir en /dev/random o /dev/urandom, lo que solo agregaría algunos datos pero no incrementaría el recuento de entropía. Se utiliza la siguiente estructura:

struct rand_pool_info {
    int    entropy_count;
    int    buf_size;
    __u32  buf[0];
};

Aquí entropy_count es el valor agregado (o restado) al recuento de entropía, y buf es el búfer de tamaño buf_size que se agrega al pool de entropía.
Pone a cero el recuento de entropía de todos los pools y agrega algunos datos del sistema (como el reloj) a dichos pools.

/dev/random
/dev/urandom

Para obtener una descripción general y una comparación de las distintas interfaces que se pueden utilizar para obtener aleatoriedad, consulte random(7).

Durante el comienzo del inicio del sistema, la lectura de /dev/urandom pueden devolver datos antes de que se inicialice el pool de entropía.

mknod(1), getrandom(2), random(7)

RFC 1750, "Randomness Recommendations for Security"

La traducción al español de esta página del manual fue creada por Juan Piernas <piernas@ditec.um.es> y Marcos Fouces <marcos@debian.org>

Esta traducción es documentación libre; lea la GNU General Public License Version 3 o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD.

Si encuentra algún error en la traducción de esta página del manual, envíe un correo electrónico a debian-l10n-spanish@lists.debian.org.

2 Mayo 2024 Páginas de Manual de Linux 6.8