Ambos /dev/random
y /dev/urandom
usar un "grupo de entropía" Cuando el grupo se agota, /dev/random
espera a que se vuelva a llenar, lo que requiere monitorear el comportamiento del sistema (entrada del teclado, movimiento del mouse, etc.), mientras /dev/urandom
que continuará brindándole datos pseudoaleatorios. /dev/random
es teóricamente de mayor calidad, pero /dev/urandom
es casi seguro que es lo suficientemente bueno para sus propósitos. (Pero incluso /dev/urandom
es probable que sea más lento que algunos otros métodos. Un generador más rápido pero de menor calidad probablemente sea lo suficientemente bueno como para borrar discos duros. No está claro que un atacante obtenga alguna ventaja al conocer la secuencia que se generará, o que los números aleatorios son mejores para este propósito que una secuencia como 0, 1, 2, 3, 4, ...)
Citando la random(4)
página del manual:
Si no está seguro de si debe usar /dev/random
o
/dev/urandom
, entonces probablemente quiera usar este último. Como regla general, /dev/urandom
debe usarse para todo excepto las claves GPG / SSL / SSH de larga duración.
ACTUALIZACIÓN : La página del manual `random (4) se ha actualizado desde que escribí eso. Ahora dice:
La /dev/random
interfaz se considera una interfaz heredada, y
/dev/urandom
se prefiere y es suficiente en todos los casos de uso, con la excepción de las aplicaciones que requieren aleatoriedad durante el inicio temprano; para estas aplicaciones, getrandom(2)
debe usarse en su lugar, porque se bloqueará hasta que se inicialice el grupo de entropía.
Ver también " Mitos sobre / dev / urandom " de Thomas Hühn.
Pero /dev/urandom
, aunque no se bloqueará, es probable que sea demasiado lento si desea generar grandes cantidades de datos. Tome algunas medidas en su sistema antes de probarlo.
EDITAR: La siguiente es una digresión sobre números aleatorios "verdaderos" versus números seudoaleatorios. Si todo lo que le interesa es una respuesta práctica a la pregunta, puede dejar de leer ahora.
Parecen reclamos (incluso en otras respuestas aquí) que /dev/random
implementan un generador de números aleatorios "verdadero", en lugar de un generador de números pseudoaleatorios (PRNG). Por ejemplo, el artículo de Wikipedia hace tal afirmación. No creo que sea correcto. Hay un poco de discusión de que aquí lo que se refiere a hardware generadores de números aleatorios, pero no veo ninguna evidencia de que /dev/random
normalmente utiliza un dispositivo de este tipo, o que los ordenadores típicos incluso tener un dispositivo de este tipo. Se diferencian de los PRNG como la rand()
función C en que no son deterministas, ya que cosechan entropía de fuentes que son prácticamente impredecibles.
Yo diría que hay tres clases de generadores de números "aleatorios":
PRNG deterministas, como la rand()
función de C , que utilizan un algoritmo para generar secuencias repetibles que tienen (más o menos) las propiedades estadísticas de una secuencia verdaderamente aleatoria. Estos pueden ser lo suficientemente buenos para los juegos (dada una buena forma de sembrarlos), y son necesarios para aplicaciones que requieren repetibilidad, pero no son adecuados para la criptografía.
A los generadores les gusta /dev/random
y /dev/urandom
esa cosecha de entropía de alguna fuente prácticamente impredecible como la actividad de E / S (esta es la razón por la cual golpear el teclado o mover el mouse puede /dev/random
producir más datos). No está claro (para mí) si estos satisfacen la definición de un PRNG (he visto definiciones que dicen que un PRNG es determinista), pero tampoco son verdaderos generadores de números aleatorios.
Generadores de números aleatorios de hardware que son físicamente impredecibles incluso con un conocimiento completo de su estado inicial, y que además utilizan técnicas matemáticas para garantizar las propiedades estadísticas correctas.