Wenn ich das watch cat /proc/sys/kernel/random/entropy_avail
sehe, steigt die Entropie meines Systems mit der Zeit langsam an, bis sie den Bereich von 180-190 erreicht und dann auf etwa 120-130 abfällt. Die Entropietropfen scheinen etwa alle zwanzig Sekunden aufzutreten. Ich beobachte dies auch dann, wenn lsof
gesagt wird, dass kein Prozess offen /dev/random
oder hat /dev/urandom
. Was entzieht der Entropie? Benötigt der Kernel auch Entropie oder verarbeitet er den größeren Pool in einen kleineren Pool mit besserer Qualität?
Dies ist eine Bare-Metal-Maschine ohne SSL / SSH / WPA-Verbindungen.
/dev/random
ist schließlich etwas, das für sichere kryptografische Zwecke verwendet wird, und die Implementierung kann es sich nicht leisten, naiv zu sein. Eine Erklärung könnte im letzten Punkt hier angedeutet werden: de.wikipedia.org/wiki/Entropy_pool#Using_observed_events (beginnend mit "Verwalten einer Stream-Chiffre mit einem Schlüssel und einem Initialisierungsvektor ...") -> Der Pool wird immer dann ersetzt, wenn es ausreicht Daten haben sich angesammelt./dev/random
in jedem Fall ziemlich falsch ist - wenn der Entropiepool einmal voll ist,/dev/urandom
ist sie genauso gut wie/dev/random
.Antworten:
Entropie geht nicht nur über verloren
/dev/{,u}random
, der Kernel nimmt auch einige auf. Beispielsweise haben neue Prozesse zufällige Adressen (ASLR) und Netzwerkpakete benötigen zufällige Folgenummern. Sogar das Dateisystemmodul kann Entropie entfernen. Siehe die Kommentare in drivers / char / random.c . Beachten Sie auch, dassentropy_avail
sich dies auf den Eingabe-Pool bezieht , nicht auf die Ausgabe-Pools (im Grunde genommen nicht blockierend/dev/urandom
und blockierend/dev/random
).Wenn Sie den Entropiepool überwachen müssen, verwenden Sie nicht
watch cat
, da dieser bei jedem Aufruf von Entropie verbrauchtcat
. In der Vergangenheit wollte ich auch diesen Pool beobachten, da GPG beim Generieren von Schlüsseln sehr langsam war. Deshalb schrieb ich ein C-Programm mit dem einzigen Zweck, den Entropiepool zu beobachten: https://git.lekensteyn.nl/c-files/tree /entropy-watcher.c .Beachten Sie, dass es Hintergrundprozesse geben kann, die auch Entropie verbrauchen. Mithilfe von Tracepoints auf einem geeigneten Kernel können Sie die Prozesse anzeigen, die den Entropiepool ändern. Beispielverwendung, bei der alle mit dem zufälligen Subsystem zusammenhängenden Tracepoints aufgezeichnet werden, einschließlich der Callchain (
-g
) auf allen CPUs (-a
), die nach 1 Sekunde mit der Messung beginnen, um ihren eigenen Prozess (-D 1000
) zu ignorieren, und einschließlich Zeitstempel (-T
):Lesen Sie es mit einem dieser Befehle (ändern Sie den Eigentümer
perf.data
nach Bedarf):Die
perf script
Ausgabe gibt einen interessanten Einblick und zeigt, wann in regelmäßigen Abständen ca. 8 Byte (64 Bit) Entropie auf meinem Computer verbraucht werden:Anscheinend geschieht dies, um eine Verschwendung von Entropie zu verhindern, indem Entropie vom Eingabepool in Ausgabepools übertragen wird:
quelle
watch
wächst die Entropie (überwacht mit ) stetig und fällt dann scharf ab. Wennwatch
bei jedem Messwert Entropie verbraucht wird, sollte diese tatsächlich stetig abnehmen.cat
sollte theoretisch den gleichen Entropiedrain haben, der nicht sichtbar sein sollte. Es stellt sich heraus, dass die Entropie in einen anderen Pool verschoben wird, wenn "genügend" Entropie vorhanden ist.lsof ist nicht das beste Tool zum Überwachen,
/dev/random
da ein Lesevorgang durch einen Prozess in sehr kurzer Zeit abgeschlossen ist. Ich kenne keine gute Methode, um herauszufinden, welcher Prozess einen Lesevorgang durchführt, aber mithilfe von könneninotify
Sie überwachen, ob es einen Lesevorgang gibt.Hier gibt es grundsätzlich zwei Möglichkeiten:
Erhalten Sie eine Zusammenfassung nach N Sekunden mit:
Sehen Sie Live - Zugang Veranstaltungen:
Weder geben Sie Prozess und Letzteres wird Ihnen nicht die Größe des Lesens geben. Der erste gibt Ihnen eine Zusammenfassung wie in:
Wenn Sie das laufen lassen und a tun
dd if=/dev/random of=/tmp/foo bs=1 count=3
, erhalten Sie die Idee.Jedenfalls. Dies gibt Ihnen keine Ticks, wenn der Kernel aus dem Pool konsumiert.
Wenn es darum geht, den Status der Entropie mit zu überprüfen
ist nicht die beste Idee, da jeder
cat
Entropie verbrauchen wird. (Ich sehe jetzt, dass eine andere Antwort auftaucht, die dies ebenfalls erwähnt.) Ich habe auch einen C-Code dafür und habe gestern versucht, ihn zu finden. Ich werde sehen, ob ich es finden und die Antwort später aktualisieren kann.quelle
/dev/random
(ich weiß, dass es auf dieser Site ähnliche Beispiele gibt).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); }