So überprüfen Sie, ob das Lesen von / dev / random blockiert wird

8

Ich habe Informationen gefunden, die /proc/sys/kernel//random/entropy_availdie Anzahl der verfügbaren Bits in angeben /dev/random. Ich wollte überprüfen, ob der nächste Messwert von /dev/randomblockiert wird, und mein naiver Ansatz bestand darin, nur die entropy_availAnzahl der erforderlichen Zufallsbits zu vergleichen, aber es funktioniert nicht gut. Als ich ein einfaches dummes Experiment machte, stellte ich fest, dass die Entropie gepuffert ist. Der 64-Bit-Entropiepuffer liefert 6 Bytes zufälliger Daten.

Ich habe die entropy_avail über diesen einfachen Befehl überwacht:

while true
do
    cat /proc/sys/kernel//random/entropy_avail
    sleep 1
done

Und ich habe versucht, ein zufälliges Byte per Befehl zu erhalten

dd if=/dev/random bs=1 count=1 > /dev/null

Der ddBefehl wird blockiert, wenn die Entropie 63 oder weniger beträgt. Wenn die Entropie 64 erreicht und ich ein Byte lese, sinkt die Entropie auf 0, aber ich kann weitere 5 Bytes lesen, ohne zu blockieren. Dann ddBlöcke wieder bis Entropie erreicht 64.

Was ist die genaue Bedeutung von entropy_avail und wie kann ich die tatsächliche Anzahl verfügbarer Zufallsbits ermitteln?

Zaboj Campula
quelle
1
Vielen Dank! Das habe ich gesucht. Das 'RTFM' ist immer eine gute Antwort.
Zaboj Campula
Lesen Sie einfach aus / dev / urandom. Siehe 2uo.de/myths-about-urandom, da es kaum einen Grund gibt, / dev / random tatsächlich zu verwenden.
Walter
1
@Walter: Du hast recht, es gibt wenig Grund aus / dev / random zu lesen. Aber diese Tatsache befriedigt meine Neugier nicht.
Zaboj Campula

Antworten:

9

entropy_availgibt nicht die Anzahl der verfügbaren Bits an /dev/random. Es zeigt die Entropieschätzung des Kernels im RNG-Zustand an, der die Leistung erbringt /dev/random. Diese Entropieschätzung ist mathematisch gesehen eine ziemlich bedeutungslose Größe; Linux blockiert jedoch, /dev/randomwenn die Entropieschätzung zu niedrig ist.

Ein Programm, das aus /dev/randomBlöcken liest , bis der Wert in /proc/sys/kernel/random/entropy_availgrößer als wird /proc/sys/kernel/random/read_wakeup_threshold. Das Lesen von /dev/randomverbraucht Entropie mit einer Rate von 8 Bits pro Byte.

Aber trotzdem solltest du nicht benutzen /dev/random. Sie sollten verwenden /dev/urandom, das genauso sicher ist, auch zum Generieren von kryptografischen Schlüsseln , und das nicht blockiert. Das Generieren von Zufallszahlen verbraucht keine Entropie: Sobald das System über genügend Entropie verfügt, ist es gut für die Lebensdauer des Universums. Das Betriebssystem speichert einen RNG-Startwert in einer Datei. Sobald das System einmal genug Entropie hat, hat es auch nach einem Neustart genug Entropie.

Die einzigen Fälle, in denen dies /dev/urandomnicht sicher ist, sind auf einem frisch installierten System, das zum ersten Mal gestartet wird, auf einem Live-System, das gerade gestartet wurde (das Generieren von kryptografischen Schlüsseln aus einem Live-System ist also keine gute Idee!) Oder auf einem frisch installierten System. Booted Embedded Device, das weder über ein Hardware-RNG noch über einen dauerhaften Speicher verfügt. Warten Sie auf solchen Systemen, bis Sie /dev/randomeinverstanden sind, 16 Bytes herauszulassen, um sicherzustellen, dass der Entropiepool aufgebaut ist. Dann verwenden /dev/urandom.

Gilles 'SO - hör auf böse zu sein'
quelle
> "Warten Sie auf solchen Systemen, bis / dev / random 16 Bytes herauslässt, um sicherzustellen, dass der Entropiepool aufgebaut ist." Wie geht das am besten? Warten Sie bis entropy_avail> 128?
Pod
1
@Pod Das funktioniert. Lassen Sie alternativ auf Systemebene einen Startzeitdienst genügend Entropie lesen (z. B. 16 Byte oder etwas mehr, um auf der sicheren Seite zu sein) /dev/random, indem Sie blockierende readAnrufe verwenden. Zu diesem Zeitpunkt ist bekannt, dass der Entropiepool ausgesät ist und Sie /dev/urandomsicher verwenden können.
Gilles 'SO - hör auf böse zu sein'
"Diese Entropieschätzung ist mathematisch gesehen eine ziemlich bedeutungslose Größe ..." Können Sie erklären, warum diese Schätzung "bedeutungslos" wäre? Diese Schätzung scheint der bogomipsSituation nicht ähnlich zu sein .
code_dredd
1
@code_dredd Kurz gesagt, die Entropieschätzung basiert auf der Annahme, dass die Entropie aufgebraucht ist: Wenn Sie ein bisschen Zufälligkeit verbraucht haben, haben Sie sie nicht mehr. Dies gilt jedoch nur, wenn Sie davon ausgehen, dass die Kryptografie, mit der die Ausgabe /dev/{u,}randomder Entropiequellen generiert wird, vollständig fehlerhaft ist. Wenn Sie davon ausgehen, dass das, was Sie mit dieser Entropie machen, wahrscheinlich auch sowieso völlig kaputt ist. Wenn Sie die Details erfahren
Gilles 'SO- hör auf böse zu sein'