Si lo hago watch cat /proc/sys/kernel/random/entropy_avail
, veo que la entropía de mis sistemas aumenta lentamente con el tiempo, hasta que alcanza el rango de 180-190, momento en el que cae a alrededor de 120-130. Las caídas en la entropía parecen ocurrir aproximadamente cada veinte segundos. Observo esto incluso cuando lsof
dice que ningún proceso tiene /dev/random
o /dev/urandom
abierto. ¿Qué está drenando la entropía? ¿El núcleo necesita también entropía, o tal vez está reprocesando el grupo más grande en un grupo más pequeño y de mejor calidad?
Esto está en una máquina de metal desnudo, sin conexiones SSL / SSH / WPA.
/dev/random
después de todo, es algo que se usa con fines criptográficos seguros, y la implementación no puede permitirse ser ingenua. En el último punto aquí se puede insinuar una explicación: en.wikipedia.org/wiki/Entropy_pool#Using_observed_events (comenzando con "Mantener un cifrado de flujo con una clave y un vector de inicialización ...") -> el grupo se reemplaza siempre que sea suficiente Se han acumulado datos./dev/random
es bastante falso : una vez que el grupo de entropía se ha llenado una vez,/dev/urandom
es tan bueno como/dev/random
.Respuestas:
La entropía no solo se pierde a través de
/dev/{,u}random
, el núcleo también toma algo. Por ejemplo, los nuevos procesos tienen direcciones aleatorias (ASLR) y los paquetes de red necesitan números de secuencia aleatorios. Incluso el módulo del sistema de archivos puede eliminar algo de entropía. Vea los comentarios en drivers / char / random.c . También tenga en cuenta que seentropy_avail
refiere al grupo de entrada , no a los grupos de salida (básicamente el no bloqueo/dev/urandom
y el bloqueo/dev/random
).Si necesita ver el grupo de entropía, no lo use
watch cat
, ya que consumirá entropía en cada invocación decat
. En el pasado, también quería ver este grupo, ya que GPG era muy lento en la generación de claves, por lo tanto, escribí un programa en C con el único propósito de ver el grupo de entropía: https://git.lekensteyn.nl/c-files/tree /entropy-watcher.c .Tenga en cuenta que puede haber procesos en segundo plano que también consumen entropía. Usando puntos de rastreo en un kernel apropiado puede ver los procesos que modifican el grupo de entropía. Ejemplo de uso que registra todos los puntos de rastreo relacionados con el subsistema aleatorio, incluida la cadena de llamada (
-g
) en todas las CPU (-a
), comenzando a medir después de 1 segundo para ignorar su propio proceso (-D 1000
) e incluyendo marcas de tiempo (-T
):Léalo con cualquiera de estos comandos (cambie el propietario de
perf.data
según sea necesario):El
perf script
resultado ofrece una visión interesante y muestra cuándo se agotan periódicamente alrededor de 8 bytes (64 bits) de entropía en mi máquina:Aparentemente, esto sucede para evitar el desperdicio de entropía al transferir la entropía desde el grupo de entrada a los grupos de salida:
fuente
watch
) crece de manera constante y luego cae bruscamente. Si sewatch
consume entropía en cada lectura, en realidad debería disminuir constantemente.cat
debería en teoría tener el mismo drenaje de entropía que no debería ser visible. Resulta que la entropía se mueve a un grupo diferente cuando hay entropía "suficiente".lsof no es la mejor herramienta para monitorear,
/dev/random
ya que una lectura de un proceso termina en muy poco tiempo. No conozco un buen método para obtener qué proceso está haciendo una lectura, pero al usarloinotify
puedes monitorear si hay una lectura.Aquí hay básicamente dos formas:
Obtenga un resumen después de N segundos con:
Ver eventos de acceso en vivo :
Ninguno de los dos le dará el proceso y este último no le dará el tamaño de la lectura. El primero le dará un resumen como en:
Si tienes eso funcionando y haces un
dd if=/dev/random of=/tmp/foo bs=1 count=3
, tienes la idea.De todos modos. Esto no le dará ticks cuando el núcleo consume del grupo.
Cuando se trata de verificar el estado de la entropía usando
No es la mejor idea, ya que cada uno
cat
va a consumir entropía. (Ahora veo que apareció otra respuesta que también menciona esto). También tengo un código C para esto e intenté localizarlo ayer. Veré si puedo encontrarlo y actualizaré la respuesta más tarde.fuente
/dev/random
(sé que hay ejemplos similares en este sitio).watch cat
:use Fcntl 'SEEK_SET'; open(my $fh,"<", "/proc/sys/kernel/random/entropy_avail"); while (1) { print <$fh>; sleep(1); seek($fh,0,SEEK_SET); }