/dev/random
# /dev/random

En sistemas operativos tipo Unix, /dev/random es un archivo especial que sirve como generador de números aleatorios, o de números pseudoaleatorios. Permite el acceso al ruido ambiental recogido de dispositivos y otras fuentes.

No todos los sistemas operativos implementan la misma semántica para /dev/random.

## GNU/Linux

GNU/Linux fue el primer sistema operativo en implementar un generador de números aleatorios a nivel de sistema operativo. La implementación utiliza hashes seguros en lugar de cifrados, como se necesita para evitar restricciones legales que existían cuando el algoritmo fue diseñado originalmente. La implementación también fue diseñada bajo la premisa de que cualquier hash o cifrado podría, eventualmente, ser débil, por lo que el diseño es robusto frente a cualquiera de esas debilidades.

En estas implementaciones el generador mantiene una estimación del número de bits de ruido en la fuente de entropía. Desde esta fuente se crean los números aleatorios. Cuando son leídos, /dev/random solo devolverá bytes aleatorios dentro del número estimado de bits de ruido en la fuente de entropía. /dev/random debería ser adecuado para situaciones en las que se necesite aleatoriedad de alta calidad, como podría ser el caso de generación de claves. Cuando la fuente de entropía esté vacía, las lecturas de /dev/random se bloquearán hasta que el ruido adicional del ambiente sea recogido.

Una contraparte para /dev/random es /dev/urandom, que reutiliza la fuente interna para producir más bits pseudoaleatorios. Esto implica que las llamadas de lectura nunca se bloquearán, pero la salida puede contener menos entropía que una lectura de /dev/random. La intención es servir como generador de números pseudoaleatorios criptográficamente seguro. Este puede ser utilizado en aplicaciones que no necesiten tanta seguridad.

También es posible escribir a /dev/random. Esto permite a cualquier usuario mezclar datos aleatorios a la fuente. Los datos no aleatorios son inocuos porque solo un usuario con los privilegios adecuados podrá utilizar ioctl para aumentar la estimación de entropía.

En marzo de 2006, Gutterman, Pinkas y Reinman publicaron un análisis criptográfico detallado del generador de números aleatorios de GNU/Linux en el que describen varias debilidades. Probablemente la más severa es en sistemas embebidos (routers) o aquellos que corren completamente en memoria como LiveCD o clientes sin almacenamiento físico, para los que el estado de arranque es predecible y la fuente de entropía disponible del ambiente es limitada. Para un sistema con memoria flash recomiendan guardar información del generador de números aleatorios en el momento de apagar el sistema de forma que pueda ser incluido al mismo en el próximo arranque. En caso de un enrutador para el que el tráfico de la red representa la fuente primaria de entropía notan que guardar información cada vez que se lo reinicia «requeriría que atacantes potenciales se inmiscuyeran en todo el tráfico de la red» desde el momento en que se pone el enrutador en servicio por primera vez, o bien, que tuviesen acceso directo al estado interno del enrutador. Esto, notan, es particularmente crítico en el caso de un enrutador inalámbrico en el que el tráfico de la red puede ser capturado a distancia y que puede estar utilizando el generador de números aleatorios para generar las claves de cifrado.

## FreeBSD

El sistema operativo FreeBSD implementa el algoritmo Yarrow para proveer de un flujo pseudoaleatorio. A diferencia de la versión de GNU/Linux, el /dev/random de FreeBSD nunca se bloquea. Sería el equivalente funcional del /dev/urandom de GNU/Linux, pensado para servir como generador de números aleatorios criptográficamente seguro y no como un verdadero generador de números aleatorios.

El algoritmo Yarrow fue diseñado para recuperarse rápidamente de una fuente de entropía comprometida. Esto es de un valor muy limitado, ya que los requisitos de acceso para comprometer la fuente de entropía son suficientes como para realizar ataques más sencillos en partes no relacionadas del sistema operativo. Comparado con el algoritmo de GNU/Linux que será seguro aún con funciones criptográficas subyacentes débiles, Yarrow utiliza una fuente de entropía muy pequeña y depende de cifrados modernos.

## macOS

macOS usa el algoritmo Yarrow basado en SHA1. No hay diferencia entre /dev/random y /dev/urandom, ambos hacen el mismo proceso. Los dispositivos móviles con el sistema iOS usan también Yarrow para la generación de números pseudoaleatorios.

