En sistemas operativos similares a Unix , / dev / random , / dev / urandom y / dev / arandom son archivos especiales que sirven como generadores de números pseudoaleatorios . Permiten el acceso al ruido ambiental recopilado de los controladores de dispositivos y otras fuentes. [1] / dev / random normalmente se bloquea si hay menos entropía disponible de la solicitada; / dev / urandom normalmente nunca se bloquea, incluso si la semilla del generador de números pseudoaleatorios no se inicializó completamente con entropía desde el arranque. / dev / arandombloquea después del arranque hasta que la semilla se haya inicializado de forma segura con suficiente entropía, y luego nunca se vuelva a bloquear. No todos los sistemas operativos implementan los mismos métodos para / dev / random y / dev / urandom y solo unos pocos proporcionan / dev / arandom .
Ejemplo
> hexdump -C -n 8 / dev / aleatorio 0000000 79 5d 13 c2 b4 fe ca d7 | y] .´þÊ × | > hexdump -C -n 8 / dev / aleatorio 0000000 bd f1 6d 48 10 f8 25 3c | ..mH ..% <|
Este script de shell es un generador de caracteres imprimible aleatorio, ligeramente sesgado:
#! / bin / sh printf "\ $ ti" ; leer png ; pc = 1 ; while [ $ pc -le $ (( ( $ {# pngs } % 5 ) + 8 )) ] ; no lea s s2 ; printf "\ n \ n" ; printf ` printf " \\% o " " $ (( ( $ {# s } % 26 ) + 65 )) " ` ; printf ` printf " \\% o " " $ (( ( $ {# s2 } % 26 ) + 97 )) " ` ; l = $ {# s } ; i = 1 ; mientras que [ $ i -le $ l ] ; do c = ` printf % c " $ { s % $ { s #? }} " ` ; s = $ { s #? } ; cc = ` printf % d \` printf "\ 047 $ c " 2 > & - \ ` ` ; printf ` printf " \\% o " " $ (( (( cc + i )% 95 ) + 32 )) " ` ; i = $ (( i + 1 )) ; hecho ; pc = $ (( pc + 1 )) ; hecho ;
Linux
La generación de números aleatorios en el espacio del kernel fue implementada por primera vez para Linux [2] en 1994 por Theodore Ts'o . [3] La implementación utilizó hashes seguros en lugar de cifrados , [ aclaración necesaria ] para evitar las restricciones de exportación de criptografía que estaban vigentes cuando el generador fue diseñado originalmente. La implementación también se diseñó con la suposición de que cualquier hash o cifrado dado eventualmente podría resultar débil, por lo que el diseño es duradero frente a tales debilidades. La recuperación rápida del compromiso del grupo no se considera un requisito, porque los requisitos del compromiso del grupo son suficientes para ataques mucho más fáciles y directos en partes no relacionadas del sistema operativo.
En la implementación de Ts'o, el generador mantiene una estimación del número de bits de ruido en la reserva de entropía . A partir de esta reserva de entropía se crean números aleatorios. Cuando se lee, el / dev / random device solo devolverá bytes aleatorios dentro del número estimado de bits de ruido en el grupo de entropía. Cuando el grupo de entropía está vacío, lee de / dev / random se bloqueará hasta que se acumule ruido ambiental adicional. [4] La intención es servir como un generador de números pseudoaleatorios criptográficamente seguro , entregando resultados con entropía tan grande como sea posible. Esto es sugerido por los autores para su uso en la generación de claves criptográficas para una protección de alto valor o de largo plazo. [4]
Una contraparte de / dev / random es / dev / urandom ("ilimitado" [5] / fuente aleatoria sin bloqueo [4] ) que reutiliza el grupo interno para producir más bits pseudoaleatorios. Esto significa que la llamada no se bloqueará, pero la salida puede contener menos entropía que la lectura correspondiente de / dev / random . Tiempo / dev / urandom todavía está pensado como un generador de números pseudoaleatorios adecuado para la mayoría de los propósitos criptográficos, los autores de la página de manual correspondiente señalan que, teóricamente, puede existir un ataque aún no publicado en el algoritmo utilizado por / dev / urandom , y que los usuarios preocupados por un ataque de este tipo deberían usar / dev / random en su lugar. [4] Sin embargo, es poco probable que se produzca un ataque de este tipo, porque una vez que el grupo de entropía es impredecible, no pierde seguridad en un número reducido de bits. [6]
También es posible escribir a / dev / random . Esto permite que cualquier usuario mezcle datos aleatorios en el grupo. Los datos no aleatorios son inofensivos, porque solo un usuario privilegiado puede emitir el ioctl necesario para aumentar la estimación de entropía. [ dudoso ] La cantidad actual de entropía y el tamaño del grupo de entropía del kernel de Linux, ambos medidos en bits, están disponibles en / proc / sys / kernel / random / y se pueden mostrar con el comando cat /proc/sys/kernel/random/entropy_avail
y cat /proc/sys/kernel/random/poolsize
respectivamente.
Gutterman, Pinkas y Reinman en marzo de 2006 publicaron un análisis criptográfico detallado del generador de números aleatorios de Linux [7] en el que describen varias debilidades. Quizás el problema más grave que informan es con los sistemas integrados o Live CD , como enrutadores y clientes sin disco , para los cuales el estado de arranque es predecible y el suministro disponible de entropía del entorno puede ser limitado. Para un sistema con memoria no volátil, recomiendan guardar algún estado del RNG en el apagado para que pueda incluirse en el estado RNG en el próximo reinicio. En el caso de un enrutador para el cual el tráfico de red representa la principal fuente de entropía disponible, señalan que guardar el estado en los reinicios "requeriría que los atacantes potenciales escuchen a escondidas todo el tráfico de la red" desde el momento en que el enrutador se puso en servicio por primera vez, u obtenga acceso directo al estado interno del enrutador. Este problema, señalan, es particularmente crítico en el caso de un enrutador inalámbrico cuyo tráfico de red se puede capturar a distancia y que puede estar usando el RNG para generar claves para el cifrado de datos.
El kernel de Linux proporciona soporte para varios generadores de números aleatorios de hardware , en caso de que estén instalados. La salida bruta de tal dispositivo puede obtenerse de / dev / hwrng . [8]
Con el kernel de Linux 3.16 y más reciente, [9] el kernel mismo mezcla datos de generadores de números aleatorios de hardware en / dev / random en una escala móvil basada en la calidad de estimación de entropía definible del HWRNG. Esto significa que ningún demonio de espacio de usuario, como rngd de rng-tools , es necesario para hacer ese trabajo. Con el kernel de Linux 3.17+, VirtIO RNG se modificó para tener una calidad predeterminada definida por encima de 0, [10] y, como tal, es actualmente el único HWRNG mezclado en / dev / random por defecto.
El grupo de entropía se puede mejorar con programas como timer_entropyd , haveged , sonido aleatorio, etc. Con rng-tools , generadores de números aleatorios de hardware como Entropy Key, etc.pueden escribir en / dev / random . Los programas de pruebas intransigentesdieharder , intransigente y ent puede probar estos generadores de números aleatorios. [11] [12] [13] [14]
En enero de 2014, Daniel J. Bernstein publicó una crítica [15] de cómo Linux mezcla diferentes fuentes de entropía. Él describe un ataque en el que una fuente de entropía capaz de monitorear las otras fuentes de entropía podría modificar su salida para anular la aleatoriedad de las otras fuentes de entropía. Considere la funcióndonde H es una función hash y x , y , z son fuentes de entropía, siendo z la salida de un HRNG Z malicioso basado en CPU:
- Z genera un valor aleatorio de r .
- Z calcula.
- Si la salida de es igual al valor deseado, salida r como z .
- De lo contrario, repita comenzando en 1.
Bernstein estimó que un atacante necesitaría repetir 16 veces para comprometer DSA y ECDSA. Esto es posible porque Linux vuelve a sembrar H de forma continua en lugar de utilizar una única semilla de alta calidad.
En octubre de 2016, con el lanzamiento de la versión 4.8 del kernel de Linux , el / dev / urandom fue cambiado a un ChaCha20 -basado generador de números pseudoaleatorios criptográfica (CPRNG) aplicación [16] por Theodore Ts'o , basado en Bernstein Es bien considerado corriente de cifra ChaCha20 .
En 2020, la versión 5.6 del kernel de Linux / dev / random solo se bloquea cuando el CPRNG no se ha inicializado. Una vez inicializado, / dev / random y / dev / urandom se comporta igual. [17]
FreeBSD
El sistema operativo FreeBSD proporciona una / dev / urandom enlace a / dev / random . Ambos bloquean solo hasta que estén debidamente sembrados. PRNG ( Fortuna ) de FreeBSD se reinicia regularmente y no intenta estimar la entropía. En un sistema con poca actividad en la red y el disco, la reinicialización se realiza después de una fracción de segundo.
OpenBSD
Desde OpenBSD 5.1 (1 de mayo de 2012) / dev / random y / dev / arandom usa un algoritmo basado en RC4 pero renombrado, por razones de propiedad intelectual, ARC4. Si bien la generación de números aleatorios aquí usa la entropía del sistema recopilada de varias maneras, el algoritmo ARC4 proporciona un sistema a prueba de fallas, lo que garantiza que se proporcione un flujo de números pseudoaleatorios rápido y de alta calidad incluso cuando el grupo está en un estado de baja entropía. El sistema utiliza automáticamente generadores de números aleatorios de hardware (como los proporcionados en algunos concentradores PCI de Intel) si están disponibles, a través del marco criptográfico de OpenBSD .
A partir de OpenBSD 5.5 (1 de mayo de 2014), la arc4random()
llamada utilizada para los dispositivos aleatorios de OpenBSD ya no usa ARC4, sino ChaCha20 (el nombre arc4random podría reconsiderarse como una llamada de reemplazo para aleatorio ). [18] [19] La implementación de NetBSD de la arc4random()
API heredada también se ha cambiado a ChaCha20. [20]
macOS, iOS y otros sistemas operativos de Apple
Todos los sistemas operativos de Apple se han trasladado a Fortuna desde al menos diciembre de 2019, posiblemente antes. [21] Está basado en SHA-256 . Se utilizan múltiples fuentes de entropía, como el RNG de enclave seguro, la fluctuación de sincronización de la fase de arranque, la interrupción de hardware (se supone que la sincronización). RDSEED / RDRAND se utiliza en Macs basados en Intel que lo admiten. Los datos de semilla (entropía) también se almacenan para reinicios posteriores.
Antes del cambio, macOS e iOS usaban Yarrow de 160 bits basado en SHA-1 . [22]
No hay diferencia entre / dev / random y / dev / urandom ; ambos se comportan de manera idéntica. [23] [24]
Otros sistemas operativos
/ dev / random y / dev / urandom también están disponibles en Solaris, [25] NetBSD, [26] Tru64 UNIX 5.1B, [27] AIX 5.2 [28] y HP-UX 11i v2. [29] Al igual que con FreeBSD, AIX implementa su propio diseño basado en Yarrow, sin embargo, AIX usa considerablemente menos fuentes de entropía que el estándar. / dev / implementación aleatoria y deja de rellenar el grupo cuando cree que contiene suficiente entropía. [30]
En Windows NT , una funcionalidad similar la proporciona ksecdd.sys , pero leyendo el archivo especial \ Device \ KsecDD no funciona como en UNIX. Los métodos documentados para generar bytes criptográficamente aleatorios son CryptGenRandom y RtlGenRandom .
Si bien DOS no proporciona naturalmente dicha funcionalidad, existe un controlador de terceros de código abierto llamado noise.sys , [31] que funciona de manera similar en el sentido de que crea dos dispositivos, RANDOM $ y URANDOM $ , que también son accesibles como / DEV / RANDOM $ y / DEV / URANDOM $ , al que los programas pueden acceder para obtener datos aleatorios.
El emulador de Linux Cygwin en Windows proporciona implementaciones de ambos / dev / random y / dev / urandom , que se puede utilizar en scripts y programas. [32]
EGD como alternativa
Un programa de software llamado EGD (demonio de recolección de entropía) es una alternativa común para los sistemas Unix que no son compatibles con el / dev / dispositivo aleatorio . Es un demonio de espacio de usuario , que proporciona datos aleatorios criptográficos de alta calidad [ cita requerida ] . Algún software criptográfico como OpenSSL , GNU Privacy Guard y el servidor HTTP Apache admiten el uso de EGD cuando / dev / random device no está disponible. OpenSSL inhabilitó el soporte para el demonio EGD de forma predeterminada en OpenSSL 1.1.0; las aplicaciones deben buscar soporte usando la OPENSSL_NO_EGD
macro del preprocesador.
EGD recopila entropía aleatoria de varias fuentes, la procesa para eliminar el sesgo y mejorar la calidad criptográfica, y luego la pone a disposición en un socket de dominio Unix (con / dev / egd-pool es una opción común) o sobre un socket TCP . [33] La entropía reunir por lo general implica periódicamente bifurcan subprocesos a consulta atributos del sistema que son propensos a ser con frecuencia cambiando e impredecibles, tales como CPU, O, y la utilización de seguimiento de I / red, así como el contenido de varios archivos de registro y temporal directorios .
El PRNGD alternativo, [34] es una fuente pseudoaleatoria compatible.
EGD se comunica con otros programas que necesitan datos aleatorios mediante un protocolo simple . El cliente se conecta a un conector EGD y envía un comando, identificado por el valor del primer octeto :
- comando 0: consulta la cantidad de entropía actualmente disponible. El demonio EGD devuelve un número de 4 bytes en formato big-endian que representa el número de bytes aleatorios que actualmente se pueden satisfacer sin demora.
- comando 1: obtener bytes aleatorios, sin bloqueo. El segundo byte en la solicitud le dice a EGD cuántos bytes aleatorios de salida debe devolver, de 1 a 255. Si EGD no tiene suficiente entropía para satisfacer inmediatamente la solicitud, entonces se pueden devolver menos bytes, o quizás ningún bytes. El primer octeto de la respuesta indica cuántos bytes adicionales, los que contienen los datos aleatorios, siguen inmediatamente a la respuesta.
- comando 2: obtener bytes aleatorios, bloquear. El segundo byte le dice a EGD cuántos bytes aleatorios de salida debe devolver. Si EGD no tiene suficiente entropía, esperará hasta que se haya reunido lo suficiente antes de responder. A diferencia del comando 1, la respuesta comienza inmediatamente con los bytes aleatorios en lugar de un octeto de longitud, ya que la longitud total de los datos devueltos no variará de la cantidad solicitada.
- comando 3: actualiza la entropía. Este comando permite al cliente proporcionar entropía adicional para agregar al grupo interno de EGD. Los siguientes dos bytes, interpretados como un entero big-endian de 16 bits, indican cuántos bits de aleatoriedad afirma que está suministrando la persona que llama. El cuarto byte indica cuántos bytes adicionales de datos de origen siguen en la solicitud. El demonio EGD puede mezclar la entropía recibida y no devolverá nada.
Ver también
- CryptGenRandom : el CSPRNG de la API de Microsoft Windows
- / dev
- Llamadas al sistema de suministro de entropía
- Algoritmo de Fortuna
- Generador de números aleatorios de hardware
- Flujos estándar
Referencias
- ↑ Torvalds, Linus (16 de abril de 2005). "Controladores del kernel de Linux / char / random.c comment documentation @ 1da177e4" . Consultado el 22 de julio de 2014 .
- ^ Lloyd, Jack (9 de diciembre de 2008). "En Syllable's / dev / random" . Consultado el 21 de agosto de 2019 .
- ^ "/ dev / random" . Todo 2 . 2003-06-08. Archivado desde el original el 29 de abril de 2009 . Consultado el 3 de julio de 2013 .
- ^ a b c d - Manual del programador de Linux - Archivos especiales
- ^ "Implementación / dev / random y / dev / urandom en Linux 1.3.39, función random_read_unlimited" . 1995-11-04 . Consultado el 21 de noviembre de 2013 .
- ^ Filippo Valsorda (29 de diciembre de 2015). La simple realidad de la entropía .
- ^ Gutterman, Zvi; Pinkas, Benny; Reinman, Tzachy (6 de marzo de 2006). "Análisis del generador de números aleatorios de Linux" (PDF) . Archivado (PDF) desde el original el 3 de octubre de 2008 . Consultado el 3 de julio de 2013 .
- ^ "Guía de usuarios de criptografía" . Texas Instruments . 2013-06-04. Archivado desde el original el 16 de abril de 2018 . Consultado el 3 de julio de 2013 .
- ^ "kernel / git / torvalds / linux.git - árbol de fuentes del kernel de Linux @ be4000bc4644d027c519b6361f5ae3bbfc52c347" hwrng: crear hilo de relleno " " . Git.kernel.org . Consultado el 18 de octubre de 2016 .
- ^ "kernel / git / torvalds / linux.git - árbol de fuentes del kernel de Linux @ 34679ec7a0c45da8161507e1f2e1f72749dfd85c" virtio: rng: agregar factor de reducción para que lo use hwrng core " " . Git.kernel.org . Consultado el 18 de octubre de 2016 .
- ^ "??" . Vanheusden.com . Archivado desde el original el 21 de septiembre de 2013 . Consultado el 23 de octubre de 2016 .
- ^ "Archivo de código de Google para dieharder" . Code.google.com . Consultado el 18 de octubre de 2016 .
- ^ "El CDROM de números aleatorios de Marsaglia, incluida la batería de pruebas de aleatoriedad" . Stat.fsu.edu . Archivado desde el original el 25 de enero de 2016 . Consultado el 23 de octubre de 2016 .
- ^ "rng-tools" . Gnu.org . Consultado el 23 de octubre de 2016 .
- ^ Daniel J. Bernstein (5 de febrero de 2014). "cr.yp.to: 2014.02.05: ¡Ataques de entropía!" .
- ^ "kernel / git / torvalds / linux.git - árbol de fuentes del kernel de Linux" . kernel.org. 2016-07-27 . Consultado el 23 de noviembre de 2016 .
- ^ "/ dev / random se parece más a / dev / urandom con Linux 5.6 - Phoronix" . www.phoronix.com .
- ^ - Manual de funciones de la biblioteca OpenBSD
- ^ deraadt , ed. (21 de julio de 2014). "libc / crypt / arc4random.c" . Referencia cruzada BSD, OpenBSD src / lib / . Consultado el 13 de enero de 2015 .
Generador de números aleatorios basado en ChaCha para OpenBSD.
- ^ riastradh, ed. (16 de noviembre de 2014). "libc / gen / arc4random.c" . Referencia cruzada BSD, NetBSD src / lib / . Consultado el 13 de enero de 2015 .
API arc4random (3) heredada de OpenBSD reimplementada usando ChaCha20 PRF, con estado por subproceso.
- ^ "Seguridad de la plataforma Apple" . Apple Inc.
- ^ "xnu-1456.1.26 / bsd / dev / random" . Apple Inc. Consultado el 18 de octubre de 2016 .
- ^ - Manual de interfaces del kernel de Darwin y macOS
- ^ "Seguridad de iOS" (PDF) . Apple Inc. Octubre de 2012. Archivado desde el original (PDF) el 5 de abril de 2014 . Consultado el 27 de mayo de 2015 .
- ^ Moffat, Darren (12 de septiembre de 2013). "Generación de números aleatorios de Solaris" . Consultado el 12 de mayo de 2016 .
- ^ - Manual de interfaces del kernel de NetBSD
- ^ "aleatorio (4)" . 1999-09-19 . Consultado el 3 de julio de 2013 .
- ^ "Dispositivos aleatorios y urandom" . Centro de información de pSeries y AIX . 2010-03-15. Archivado desde el original el 12 de julio de 2013 . Consultado el 3 de julio de 2013 .
- ^ "Generador de números aleatorios fuerte HP-UX" . 2004-07-23 . Consultado el 3 de julio de 2013 .
- ^ Roberts, Iain (25 de abril de 2003). "Dispositivos AIX 5.2 / dev / random y / dev / urandom" . Lists.gnupg.org. Archivado desde el original el 22 de febrero de 2012 . Consultado el 3 de julio de 2013 .
- ^ "Sitio web de Doug Kaufman - puertos DOS" . 2006-11-02 . Consultado el 3 de julio de 2013 .
- ^ "¿Cómo funcionan Cygwin's / dev / random y urandom?" . www.linuxquestions.org . Consultado el 9 de marzo de 2018 .
- ^ Warner, Brian (25 de julio de 2002). "EGD: El demonio de recolección de entropía" . Consultado el 3 de julio de 2013 .
- ^ Jänicke, Lutz (12 de enero de 2007). "PRNGD - Demonio generador de números pseudo aleatorios" . Consultado el 3 de julio de 2013 .
enlaces externos
- Biege, Thomas (6 de noviembre de 2006). "Análisis de un potente generador de números pseudo aleatorios mediante la anatomización del dispositivo de números aleatorios de Linux" (PDF) .
- Hühn, Thomas (2014). "Mitos sobre / dev / urandom" .