random(4) Device Drivers Manual random(4) NOMBRE random, urandom - dispositivos del nucleo para generar numeros aleatorios SINOPSIS #incluir int ioctl(fd, RNDsolicitud, param); DESCRIPCION Los archivos especiales /dev/random y /dev/urandom (presentes desde la version 1.3.30 de Linux) proporcionan una interfaz con el generador de numeros aleatorios del nucleo. El archivo /dev/random tiene 1 como numero mayor de dispositivo y 8 como numero menor de dispositivo. El fichero /dev/urandom tiene 1 como numero mayor de dispositivo y 9 como numero menor de dispositivo. El generador de numeros aleatorios recoge el ruido ambiental procedente de los drivers de dispositivos y otras fuentes y lo guarda en un 'pool de entropia'. El generador tambien mantiene una estimacion del numero de bits de ruido de dicho pool. Los numeros aleatorios se crearan en base a este pool. Linux 3.17 y posteriores proporcionan una interfaz getrandom(2) mas sencilla y segura que no requiere archivos especiales; consulte la pagina del manual getrandom(2) para obtener mas detalles. Durante su lectura, el dispositivo /dev/urandom muestra bytes aleatorios creados por un generador de numeros pseudoaleatorios basado en el pool de entropia. 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 entropia. 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 epoca en la que las primitivas criptograficas utilizadas en la implementacion de /dev/urandom no eran demasiado fiables. Creara bytes aleatorios solo dentro del numero estimado de bits de ruido nuevo en el pool de entropia, bloqueandolos si necesario. /dev/random es adecuado para aplicaciones que necesitan aleatoriedad de alta calidad y pueden permitirse retrasos indeterminados. Cuando el pool de entropia este vacio, se bloqueara 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 bloqueara 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 bloqueara si el numero de bytes solicitado no esta disponible sino que se devuelven los bytes disponibles. Si no hay ningun byte disponible, read(2) devolvera -1 y errno se establecera 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 devolveran tantos bytes como se soliciten y no seran interrumpidas por ningun controlador de senales. Las lecturas con un bufer por encima de este limite pueden devolver una cantidad menor del numero de bytes solicitado o fallar con el error EINTR, si son interrumpidas por un controlador de senal. Desde Linux 3.16, un read(2) de /dev/urandom retornara un maximo de 32 MB. Un read(2) de /dev/random devolvera un maximo 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 entropia con esos datos escritos, pero esto no dara un recuento de entropia mas alto. Afectara al contenido leido de ambos archivos, pero no hara que las lecturas de /dev/random sean mas rapidas. Modo de empleo La interfaz /dev/random se considera una interfaz heredada y /dev/urandom es la preferida en todos los casos, con la excepcion de aplicaciones que requieren aleatoriedad durante el comienzo del inicio del equipo. Dichas aplicaciones, deberan usar getrandom(2) en su lugar, porque se bloquearan hasta que se inicialice el pool de entropia. Si se guarda un archivo semilla entre los reinicios como se recomienda a continuacion, la salida sera criptograficamente 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 sesion de cifrado de red. Las principales distribuciones de Linux guardan dicho archivo semilla desde, al menos, el ano 2000. Dado que las lecturas de /dev/random pueden bloquearse, los usuarios normalmente querran abrirlo en modo sin bloqueo (o realizar una lectura con tiempo de espera). y proporcionar algun tipo de notificacion al usuario si la entropia deseada no esta disponible de inmediato. Configuracion Si en su sistema no existen todavia /dev/random y /dev/urandom, puede crearlos con las siguientes ordenes: 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 interacion del operador, el pool de entropia puede estar en un estado bastante predecible. Esto reduce la cantidad actual de ruido en el pool de entropia por debajo de lo recomendado. Para contrarestar este efecto, es posible conservar la informacion del pool de entropia entre los reinicios del sistema. Para hacer esto, anada las lineas a un script de shell adecuado que se ejecute durante la secuencia de inicio: echo "Iniciando generador de numeros aleatorios..." random_seed=/var/run/random-seed # Guarda una semilla entre reinicios del sistema # Carga y guarda todo el pool de entropia 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 Tambien, anada las siguientes lineas a un guion 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 entropia echo "Guardando semilla de entropia..." 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 tamano del pool de entropia en bits (ver a continacion). Interfaces /proc Los archivos en el directorio /proc/sys/kernel/random (presente desde Linux 2.3.16) proporcionan informacion adicional sobre el dispositivo /dev/random: entropy_avail Este archivo de solo lectura proporciona la entropia disponible, en bits. Esta sera un numero en el intervalo de 0 a 4096. poolsize Este archivo proporciona el tamano del pool de entropia. El formato de este archivo varia segun las versiones del kernel: Linux 2.4: Este archivo proporciona el tamano del pool de entropia en bytes. Normalmente, este archivo tendra el valor 512, pero es posible escribir en el 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. Linux 2.6 y posterior: Este archivo es de solo lectura y proporciona el tamano del pool de entropia en bits. Contiene el valor 4096. read_wakeup_threshold Este archivo contiene los bits de entropia necesarios para reactivar procesos en pausa esperando entropia de /dev/random. El valor predeterminado es 64. write_wakeup_threshold Este archivo contiene la cantidad de bits de entropia 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. uuid y boot_id 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 solo una vez. interfaz ioctl(2) Las siguientes solicitudes ioctl(2) se definen en descriptores de archivos conectados bien a /dev/random o a /dev/urandom. Todas las solicitudes realizadas interactuaran con el pool de entropia de entrada, lo que afectara tanto a /dev/random como a /dev/urandom. La capacidad CAP_SYS_ADMIN es necesaria para todas las solicitudes salvo para RNDGETENTCNT. RNDGETENTCNT Recupera el recuento de entropia del pool de entrada; el contenido sera el mismo que el del archivo entropy_avail en proc. El resultado se almacenara en el int senalado por el argumento. RNDADDTOENTCNT Incrementa o disminuye el recuento de entropia del pool de entrada por el valor senalado en el argumento. RNDGETPOOL Eliminado en Linux 2.6.9. RNDADDENTROPY Agrega algo de entropia adicional al grupo de entrada, incrementando el recuento de entropia. Es diferente a escribir en /dev/random o /dev/urandom, lo que solo agregaria algunos datos pero no incrementaria el recuento de entropia. Se utiliza la siguiente estructura: struct rand_pool_info { int entropy_count; int buf_size; __u32 buf[0]; }; Aqui entropy_count es el valor agregado (o restado) al recuento de entropia, y buf es el bufer de tamano buf_size que se agrega al pool de entropia. RNDZAPENTCNT RNDCLEARPOOL Pone a cero el recuento de entropia de todos los pools y agrega algunos datos del sistema (como el reloj) a dichos pools. ARCHIVOS /dev/random /dev/urandom NOTAS Para obtener una descripcion general y una comparacion de las distintas interfaces que se pueden utilizar para obtener aleatoriedad, consulte random(7). ERRORES Durante el comienzo del inicio del sistema, la lectura de /dev/urandom pueden devolver datos antes de que se inicialice el pool de entropia. VEASE TAMBIEN mknod(1), getrandom(2), random(7) RFC 1750, "Randomness Recommendations for Security" TRADUCCION La traduccion al espanol de esta pagina del manual fue creada por Juan Piernas y Marcos Fouces Esta traduccion es documentacion libre; lea la GNU General Public License Version 3 o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD. Si encuentra algun error en la traduccion de esta pagina del manual, envie un correo electronico a . Paginas de Manual de Linux 6.8 2 Mayo 2024 random(4)