random(7) Miscellaneous Information Manual random(7)

random - visión general de las interfaces para la obtención de datos aleatorios

El generador de números aleatorios del núcleo se basa en la entropía recogida de los controladores de dispositivos y otras fuentes de ruido ambiental para sembrar un generador pseudoaleatorio de números criptográficamente seguro (CSPRNG). En su diseño se primó la seguridad sobre la velocidad.

Las siguientes interfaces proporcionan acceso a la salida del núcleo CSPRNG:

Los dispositivos /dev/urandom y dev/random se describen en random (4). Estos dispositivos existen desde los primeros tiempos de Linux, también están disponibles en muchos otros sistemas.
La llamada de sistema getrandom(2) específica de Linux, disponible desde Linux 3.17. Esta llamada del sistema proporciona acceso a la misma fuente que /dev/urandom (llamada la fuente urandom en este documento) o a la mismo fuente como /dev/random. La fuente predeterminada es urandom; la fuente random se selecciona mediante la opción GRND_RANDOM para la llamada del sistema. La función getentropy(3) proporciona una interfaz ligeramente más portable a un nivel superior de getrandom(2).)

El núcleo recoge entropía del entorno. Cuando se ha recogido un número suficiente de bits aleatorios, el pool de entropía se considera iniciado.

Salvo que se desee generar claves pensando a largo plazo (y probablemente ni siquiera asi), no debería estar leyendo desde el dispositivo /dev/random o empleando getrandom (2) con la opción GRND_RANDOM. En su lugar debería leer desde el dispositivo /dev/urandom o emplear getrandom(2) sin la opción GRND_RANDOM. Los algoritmos criptográficos utilizados para la fuente de urandom son bastante conservadores, y deberían ser suficientes para todos los casos.

La desventaja de GRND_RANDOM y de leer desde /dev/random es que la operación puede bloquear por un período de tiempo indefinido. La gestión de las solicitudes parcialmente cumplidas que pueden ocurrir cuando se utiliza GRND_RANDOM o cuando se lee desde /dev/random aumentan la complejidad del código.

El uso de estas interfaces para proporcionar grandes cantidades de datos para simulaciones de Monte Carlo u otros programas/algoritmos que están haciendo muestreo probabilístico será lento. Además, es innecesario, ya que esas aplicaciones no necesitan números aleatorios criptográficamente seguros. En su lugar, utilice las interfaces descritas en esta página para obtener una pequeña cantidad de datos para sembrar un generador de números pseudoaleatorio en el espacio de usuario para el uso de estas aplicaciones.

La siguiente tabla resume el comportamiento de las diversas interfaces que se pueden utilizar para obtener datos aleatorios. GRND_NONBLOCK se puede usar para controlar el comportamiento de bloqueo de getrandom(2). La última columna de la tabla considera el caso que puede ocurrir al comienzo del inicio cuando aún no está iniciado el pool de entropía.

Interfaz Pool Comportamiento de bloqueo Comportamiento cuando el pool aún no está preparado
/dev/random Pool de bloqueo Si el nivel de entropía es demasiado bajo, bloquea hasta que haya suficiente Bloquea hasta que se haya acumulado suficiente entropía
/dev/urandom Salida CSPRNG Nunca bloquea Devuelve la salida de un CSPRNG no iniciado (seguramente de baja entropía, no válido con fines criptográficos)
getrandom() Igual a /dev/urandom No bloquea una vez que el pool esté preparado Bloquea hasta que el pool esté preparado
getrandom() GRND_RANDOM Igual que /dev/random Si el nivel de entropía es demasiado bajo, bloquea hasta que haya suficiente Bloquea hasta que el pool esté preparado
getrandom() GRND_NONBLOCK Igual a /dev/urandom No bloquea una vez que el pool esté preparado EAGAIN
getrandom() GRND_RANDOM + GRND_NONBLOCK Igual que /dev/random EAGAIN Si no se dispone de suficiente entropía EAGAIN

El tamaño de la semilla necesaria para generar una clave criptográfica equivale al tamaño de la clave efectiva de la llave. Por ejemplo, una llave privada RSA de 3072 bits o Diffie-Hellman tiene un tamaño de llave efectivo de 128 bits (requiere aproximadamente 2^128 operaciones para romper) por lo que un generador de llaves sólo necesita 128 bits (16 bytes) de /dev/random.

Aunque es razonable un margen de seguridad por encima de ese mínimo frente afallos en el algoritmo CSPRNG, ningún primitivo criptográfico disponible actualmente puede prometer más de 256 bits de seguridad, por lo que si cualquier programa lee más de 256 bits (32 bytes) del núcleo pool aleatorio por invocación, o por un intervalo razonablemente 'resembrado' (no menos de un minuto), debe tomarse como una señal de que la criptografía no está habilmente implementada.

getrandom(2), getauxval(3), getentropy(3), random(4), urandom,(4) signal(7)

La traducción al español de esta página del manual fue creada por 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.9.1