random(7)

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

DESCRIPCIÓN
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).)

  Inicio del pool de entropía
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.

  Selección de la fuente de aleatoriedad
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.

  Monte Carlo y otras aplicaciones de muestreo probabilístico
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.

  Comparación entre getrandom, /dev/urandom y /dev/random
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

  Generación de claves criptográficas
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.

VÉASE TAMBIÉN
getrandom(2), getauxval(3), getentropy(3), random(4), urandom,(4) signal(7)

http://www.2uo.de/myths-about-urandom/

TRADUCCIÓN
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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.