¿Por qué mi / dev / random es tan lento cuando uso dd?

29

Estoy tratando de borrar de forma semi-segura un montón de discos duros. Lo siguiente está trabajando a 20-50Mb / s

dd if=/dev/zero of=/dev/sda

Pero

dd if=/dev/random of=/dev/sda 

Parece que no funciona. También cuando escribo

dd if=/dev/random of=stdout

Solo me da unos pocos bytes, independientemente de lo que pase para bs = y count =

¿Estoy usando / dev / random mal? ¿Qué otra información debo buscar para avanzar en esta solución de problemas? ¿Hay alguna otra manera de hacer esto con un script o algo así?

makeMyLifeEasy | dd if=stdin of=/dev/sda

O algo así...

Mikey
fuente
1
Solo como una nota: a menos que sospeche que la CIA persigue sus datos, una sola sobrescritura con ceros (/ dev / zero) probablemente sea suficiente. Vea, por ejemplo, superuser.com/questions/215852/… para una discusión.
sleske
En cuanto a la razón por la lectura de /dev/randomsólo devuelve unos pocos bytes, véase superuser.com/a/712515/139307
mklement0

Respuestas:

42

Ambos /dev/randomy /dev/urandomusar un "grupo de entropía" Cuando el grupo se agota, /dev/randomespera a que se vuelva a llenar, lo que requiere monitorear el comportamiento del sistema (entrada del teclado, movimiento del mouse, etc.), mientras /dev/urandomque continuará brindándole datos pseudoaleatorios. /dev/randomes teóricamente de mayor calidad, pero /dev/urandomes casi seguro que es lo suficientemente bueno para sus propósitos. (Pero incluso /dev/urandomes 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/randomo /dev/urandom, entonces probablemente quiera usar este último. Como regla general, /dev/urandomdebe 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/randominterfaz se considera una interfaz heredada, y /dev/urandomse 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/randomimplementan 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/randomnormalmente 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":

  1. 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.

  2. A los generadores les gusta /dev/randomy /dev/urandomesa 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/randomproducir 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.

  3. 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.

Keith Thompson
fuente
2
Incluso / dev / urandom es un poco lento si tiene que llenar grandes cantidades de espacio en disco (como particiones enteras, antes de crear sistemas de archivos cifrados en ellos). Esto debe tomarse como una pequeña adición a la excelente respuesta y explicación detallada.
vtest
Como no puede calcular / derivar / crear / ... más de un bit de entropía a partir de un bit aleatorio, cualquier cosa que genere / genere más bits 'aleatorios' de los que recibió como entrada es, por definición, pseudoaleatorio en el mejor de los casos. Por lo tanto, /dev/urandomclaramente es pseudoaleatorio. /dev/randomdifiere en que trata de hacer una estimación conservadora de la entropía de su entrada y no produce más entropía de la que (cree) realmente puede. Esto es independiente de la presencia de un dispositivo TRNG dedicado, porque la verdadera entropía también se puede obtener de eventos independientes de cualquier tipo, como el teclado o la red IO vs. el tiempo.
JimmyB
13

/dev/randomes una fuente de verdadera entropía, bytes verdaderamente aleatorios. Como tal, necesita una fuente de aleatoriedad. Puede 'agotar' la aleatoriedad al leerla. Le dará toda la aleatoriedad que tiene, luego bloqueará hasta que obtenga más. Probablemente esté sentado allí esperando, y la máquina obtiene muy poca aleatoriedad nueva, y solo espera.

/dev/randompara criptografía verdaderamente aleatoria, aleatoriedad de alta calidad Como tal, es una exageración para una sobrescritura de una unidad de disco. Escribir /dev/zeroalgunas veces está bien. O puede escribir desde /dev/urandom, lo que no bloqueará y dará números pseudoaleatorios cuando se quede sin aleatoriedad verdadera.

Rich Homolka
fuente
10
No, /dev/randomno genera "bytes verdaderamente aleatorios". Genera bytes pseudoaleatorios de mayor calidad que los que genera /dev/urandom.
Keith Thompson el
7

En Linux / dev / random es un archivo especial que sirve números pseudoaleatorios de alta calidad. Esta implementación recopila entropía de eventos que se originan desde el teclado, el mouse, el disco y las interrupciones del sistema. (consulte este documento) Entonces, cuando no hay tales eventos, el grupo de entropía está vacío, las lecturas de / dev / random se bloquearán hasta que se acumule ruido ambiental adicional. Esto explica tu problema. Para llenar el grupo de entropía, puede presionar las teclas del teclado.

Por otro lado, un generador de números verdaderamente aleatorio utiliza un generador de números aleatorios de hardware que genera números aleatorios a partir de procesos físicos. Estos procesos incluyen fenómenos microscópicos que generan una señal de "ruido" estadísticamente aleatorio de bajo nivel, como el ruido térmico o el efecto fotoeléctrico o Otros fenómenos físicos. Estos procesos son, en teoría, completamente impredecibles, y las afirmaciones de la teoría de la imprevisibilidad están sujetas a pruebas experimentales.

Un generador de números aleatorios de hardware generalmente consiste en un transductor para convertir algún aspecto de los fenómenos físicos en una señal eléctrica, un amplificador y otros circuitos electrónicos para aumentar la amplitud de las fluctuaciones aleatorias a un nivel macroscópico, y algún tipo de convertidor analógico a digital para convertir la salida en un número digital, a menudo un simple dígito binario 0 o 1. Al muestrear repetidamente la señal que varía aleatoriamente, se obtiene una serie de números aleatorios.

El generador de números aleatorios de hardware reúne el ruido ambiental de los controladores de dispositivos y otras fuentes en un grupo de entropía. A partir de este grupo de entropía se crean números aleatorios. Cuando se lee, el dispositivo / dev / random solo devolverá bytes aleatorios dentro del número estimado de bits de ruido en el grupo de entropía. Esto explica tu problema.

Algunas implementaciones de Hardware RNG se explican en el documento del kernel y en la información de un dispositivo .

Una contraparte de / dev / random es / dev / urandom (fuente aleatoria "desbloqueada" / no bloqueante) que reutiliza el conjunto 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.

Entonces, si su intención no es generar CSPRNG (generador de números pseudoaleatorios criptográficamente seguro), debe usar / dev / urandom.

Sachin Divekar
fuente
¿ /dev/randomRealmente utiliza fuentes como el ruido térmico? Entiendo que utiliza información del estado (relativamente) impredecible del sistema, como la actividad de E / S y el estado del proceso. No creo que la mayoría de los sistemas Linux tengan hardware que pueda generar ruido térmico. ¿Puedes citar alguna documentación sobre esto?
Keith Thompson
Sí, tiene usted razón. La información que mencioné es aplicable para el generador genérico de números aleatorios de hardware.
Sachin Divekar
Mira el documento sobre cómo se implementa en Linux en el enlace . Allí se menciona que en un entorno de PC, el LRNG recopila entropía de eventos que se originan desde el teclado, el mouse, el disco y las interrupciones del sistema. En otros entornos, el LRNG recopila entropía de los recursos disponibles. Por ejemplo, un enrutador OpenWRT no incluye un disco duro, mouse y teclado y, por lo tanto, no se pueden usar como fuentes de entropía. Por otro lado, el enrutador recoge la entropía de los eventos de red.
Sachin Divekar
Quizás puedas actualizar tu respuesta. No creo que sea exacto decir que /dev/randomgenera "números verdaderamente aleatorios".
Keith Thompson el
El artículo / dev / random en wikipedia dice que Linux fue el primer sistema operativo en implementar un verdadero generador de números aleatorios de esta manera en el primer párrafo.
Sachin Divekar
2

Sin responder su pregunta, ya hay respuestas completas aquí, también puede consultar Darik's Boot y Nuke, también conocido como DBAN, que es un limpiador de unidad de CD en vivo.

Randy Orrison
fuente
0

Solo use el shredcomando que viene con coreutils. Utiliza datos aleatorios de manera eficiente. dd es una herramienta de bajo nivel y probablemente sea un nivel demasiado bajo para esta tarea. shredsaltará eficientemente partes no grabables del dispositivo, por ejemplo.

pixelbeat
fuente