Wie @DavidSchwartz in einem Kommentar ausführte , /dev/urandomwird in den allermeisten Fällen die Verwendung bevorzugt. Er und andere stellten auch einen Link zu den hervorragenden Mythen über/dev/urandom Artikel zur Verfügung, die ich zur weiteren Lektüre empfehle.
Beide werden von demselben CSPRNG gespeist , um Zufälligkeit zu erzeugen ( Diagramm 2 und 3 ).
/dev/random blockiert, wenn die Entropie aufgebraucht ist
Der Entropiebetrag wird konservativ geschätzt, aber nicht gezählt
/dev/urandomwird niemals blockieren, Lesen von /dev/randomkann die Ausführung von Prozessen anhalten.
In seltenen Fällen hat der CSPRNG sehr kurz nach dem Start möglicherweise nicht genügend Entropie, um ordnungsgemäß ausgesät zu werden, und /dev/urandomkann möglicherweise keine Zufälligkeit von hoher Qualität erzeugen.
Entropie, die zur Neige geht, ist kein Problem, wenn das CSPRNG anfänglich richtig ausgesät wurde
Das CSPRNG wird ständig neu ausgesät
Ab Linux 4.8 wird /dev/urandomder (von /dev/random) verwendete Entropiepool nicht erschöpft, sondern die CSPRNG-Ausgabe vom Upstream verwendet.
@otus wies auch darauf hin, dass das getrandom()System /dev/urandomnur dann ausliest und blockiert, wenn die ursprüngliche Seed-Entropie nicht verfügbar ist.
macOS verwendet 160-bit Yarrow basierend auf SHA1. Es gibt keinen Unterschied zwischen / dev / random und / dev / urandom; beide verhalten sich identisch. Apples iOS verwendet ebenfalls Yarrow.
/dev/urandomist nur eine Verknüpfung zu /dev/randomund blockiert nur, bis sie richtig ausgesät sind.
Dies bedeutet, dass FreeBSD nach dem Booten klug genug ist, um zu warten, bis genügend Keimentropie gesammelt wurde, bevor ein endloser Strom zufälliger Güte bereitgestellt wird.
NetBSD
Verwenden Sie /dev/urandom, vorausgesetzt Ihr System hat mindestens einmal von gelesen /dev/random, um eine ordnungsgemäße erste Aussaat sicherzustellen.
/dev/randomManchmal blockiert. Wird beim Booten frühzeitig blockiert, wenn bekannt ist, dass der Systemstatus vorhersehbar ist.
Anwendungen sollten aus / dev / urandom lesen, wenn sie zufällig generierte Daten benötigen, z. B. kryptografische Schlüssel oder Seeds für Simulationen.
Die Systeme sollten so konfiguriert sein, dass sie beim Booten mindestens einmal mit Bedacht aus / dev / random gelesen werden, bevor Dienste ausgeführt werden, die mit dem Internet kommunizieren oder anderweitig eine Kryptografie erfordern, um zu vermeiden, dass Schlüssel vorhersehbar generiert werden.
BSD: Verwendung/dev/urandom - Außer es gibt kein /dev/urandomOpenBSD. OpenBSD hat /dev/arandom, aber du solltest es nicht benutzen, du solltest arc4random(3)stattdessen die Funktion benutzen. Vielleicht sollten Ratschläge zu zufälligen Geräten und Funktionen Personen überlassen werden, die wirklich verstehen, worum es geht?
Satō Katsura
1
@SatoKatsura Guter Fang. Auf FreeBSD aktualisiert, um das Zitat widerzuspiegeln. Wie würden Sie vorschlagen, festzustellen, wer diese Leute sind?
Tom Hale
3
Akademische Qualifikationen? Begutachtete Arbeit?
Satō Katsura
1
" /dev/randomblockiert, wenn die Entropie aufgebraucht ist" - Unter Linux hängt es davon ab, wie Sie das Gerät öffnen. Wenn openFlags enthalten O_NONBLOCK, wird es nicht blockiert. Wenn keine Entropie vorhanden ist, kehrt der Aufruf sofort zurück und zeigt 0 gelesene Bytes an.
1
@TomHale Das Verhalten ist IMO weniger überraschend. Wenn /dev/randomnur (ex :) 60 Bytes sind dd, erhalten Sie eine 60-Byte-Datei. Die Verwendung headim selben Szenario sieht wahrscheinlich für immer aus. Sie tun auch nicht, was Sie wollen, aber zumindest für mich ist es offensichtlicher, dass sie headnicht das tun, was erwartet wurde.
Ryan J
5
Traditionell ist der einzige Unterschied zwischen /dev/urandomund der, /dev/randomwas passiert, wenn der Kernel glaubt, dass keine Entropie im System vorhanden ist - /dev/randomFail-Closed, /dev/urandomFail-Open. Beide Fahrer wurden Sourcing Entropie aus add_disk_randomness(), add_interrupt_randomness()und add_input_randomness(). Siehe /drivers/char/random.cfür Einzelheiten.
Bearbeitet, um hinzuzufügen: Ab Linux 4.8 /dev/urandomwurde CSPRNG überarbeitet.
Also wann solltest du scheitern geschlossen? Für jede Art von kryptografischer Verwendung, insbesondere für das Seeding von DRBG. Es gibt ein sehr gutes Papier, in dem die Konsequenzen der Verwendung /dev/urandombei der Erzeugung von RSA-Schlüsseln und bei unzureichender Entropie erläutert werden . Lesen Sie Mining Your Ps und Qs .
Praktisch niemand benutzt / dev / random. Es ist im Wesentlichen eine veraltete Schnittstelle; Die primären Schnittstellen, die seit mehr als einem Jahrzehnt empfohlen werden, sind / dev / urandom und jetzt getrandom (2).
Wir testen regelmäßig /dev/randomund es kommt häufig zu Ausfällen. Der Test führt die drei folgenden Schritte aus: (1) Entleeren /dev/randomdurch Abfragen von 10 KB im nicht blockierenden Modus; (2) fordere 16 Bytes im Blockiermodus an (3) versuche, den Block zu komprimieren, um zu sehen, ob er zufällig ist (Test des armen Mannes). Der Test dauert Minuten.
Das Problem ist auf Debain-Systemen (i686, x86_64, ARM und MIPS) so schlimm, dass wir GCC Compile Farm gebeten haben, das rng-toolsPaket für ihre Testmaschinen zu installieren . Von Installiere rng-tools auf gcc67 und gcc68 :
Ich möchte darum bitten, dass rng-tools auf gcc67 und gcc68 installiert werden. Es handelt sich um Debian-Systeme, und / dev / random leidet unter Entropieverlust ohne rng-tools, wenn Bibliotheken zum Testen von Folter verwendet werden, die das Gerät verwenden.
Die BSDs und OS X erscheinen in Ordnung. Das Problem ist definitiv Linux.
Erwähnenswert ist auch, dass Linux keine Generatorfehler protokolliert. Sie wollten nicht, dass die Einträge das Systemprotokoll ausfüllen. Bisher sind die meisten Fehler unbemerkt und werden von den meisten Benutzern nicht erkannt.
Konkret habe ich hinzugefügt depends on DEBUG_KERNEL. Dies bedeutet, dass diese nützlichen Warnungen nur andere Kernel-Entwickler anstacheln. Das ist wahrscheinlich genau das, was wir wollen. Wenn die verschiedenen assoziierten Entwickler eine Warnung von ihrem jeweiligen Subsystem sehen, sind sie motivierter, sie zu beheben. Normale Benutzer in Verteilungskernen sollten die Warnungen oder den Spam überhaupt nicht sehen, da Benutzer normalerweise DEBUG_KERNEL nicht verwenden.
Ich halte es aus sicherheitstechnischer Sicht für eine schlechte Idee, alle Nachrichten zu unterdrücken.
Viele Leute führen keine Debug-Kernel aus. Die meisten Benutzer, die über die Probleme Bescheid wissen möchten oder müssen, werden dies nicht bemerken. Bedenken Sie, der Grund, warum wir von den Problemen von systemd erfahren haben, war der von dmesg.
Durch das Unterdrücken aller Nachrichten für alle Konfigurationen wird ein breiteres Netz als erforderlich umgewandelt. Konfigurationen, die möglicherweise erkannt und möglicherweise behoben werden, bleiben unbemerkt. Wenn das Problem nicht erkannt wird, wird es nicht behoben.
Ich glaube, der Kernel trifft politische Entscheidungen für einige Organisationen. Für diejenigen, die über Hardware verfügen, die effektiv nicht reparierbar ist, muss die Organisation entscheiden, was sie aufgrund ihres Risikoproblems tun soll. Sie entscheiden sich möglicherweise, mit dem Risiko umzugehen, oder sie entscheiden sich möglicherweise, die Hardware zu aktualisieren. Ohne Informationen zu diesem Thema können sie jedoch möglicherweise nicht einmal erkennen, dass sie einen umsetzbaren Gegenstand haben.
Der Kompromiss, der später im Thread erreicht wurde, war mindestens ein dmesg pro aufrufendem Modul.
Antworten:
TL; DR
Verwenden Sie
/dev/urandom
für die meisten praktischen Zwecke.Die längere Antwort hängt von der Version von Unix ab, die Sie verwenden.
Linux
Historisch
/dev/random
und/dev/urandom
wurden beide gleichzeitig eingeführt.Wie @DavidSchwartz in einem Kommentar ausführte ,
/dev/urandom
wird in den allermeisten Fällen die Verwendung bevorzugt. Er und andere stellten auch einen Link zu den hervorragenden Mythen über/dev/urandom
Artikel zur Verfügung, die ich zur weiteren Lektüre empfehle.In Summe:
/dev/random
blockiert, wenn die Entropie aufgebraucht ist/dev/urandom
wird niemals blockieren, Lesen von/dev/random
kann die Ausführung von Prozessen anhalten./dev/urandom
kann möglicherweise keine Zufälligkeit von hoher Qualität erzeugen./dev/urandom
der (von/dev/random
) verwendete Entropiepool nicht erschöpft, sondern die CSPRNG-Ausgabe vom Upstream verwendet./dev/urandom
.Ausnahmen von der Regel
In der Kryptografie des Stapelaustausch Wann verwendet man
/dev/random
über/dev/urandom
in Linux @otus gibt zwei Anwendungsfälle :Kurz nach dem Booten auf einem Gerät mit niedriger Entropie, wenn noch nicht genügend Entropie erzeugt wurde, um ordnungsgemäß zu säen
/dev/urandom
.Generierung eines One-Time-Pads mit informationstheoretischer Sicherheit
Wenn Sie sich Sorgen um (1) machen, können Sie die in verfügbare Entropie überprüfen
/dev/random
.Wenn Sie (2) tun, wissen Sie es bereits :)
Hinweis: Sie können überprüfen, ob das Lesen von / dev / random blockiert wird , aber achten Sie auf mögliche Rennbedingungen.
Alternative: Verwenden Sie keine!
@otus wies auch darauf hin, dass das
getrandom()
System/dev/urandom
nur dann ausliest und blockiert, wenn die ursprüngliche Seed-Entropie nicht verfügbar ist.Es gibt Probleme bei der Änderung
/dev/urandom
der Verwendunggetrandom()
, aber es ist denkbar, dass ein neues/dev/xrandom
Gerät basierend auf erstellt wirdgetrandom()
.Mac OS
Es spielt keine Rolle, wie Wikipedia sagt :
FreeBSD
Es spielt keine Rolle, wie Wikipedia sagt :
Dies bedeutet, dass FreeBSD nach dem Booten klug genug ist, um zu warten, bis genügend Keimentropie gesammelt wurde, bevor ein endloser Strom zufälliger Güte bereitgestellt wird.
NetBSD
Verwenden Sie
/dev/urandom
, vorausgesetzt Ihr System hat mindestens einmal von gelesen/dev/random
, um eine ordnungsgemäße erste Aussaat sicherzustellen.Die rnd (4) Manpage sagt :
quelle
/dev/urandom
- Außer es gibt kein/dev/urandom
OpenBSD. OpenBSD hat/dev/arandom
, aber du solltest es nicht benutzen, du solltestarc4random(3)
stattdessen die Funktion benutzen. Vielleicht sollten Ratschläge zu zufälligen Geräten und Funktionen Personen überlassen werden, die wirklich verstehen, worum es geht?/dev/random
blockiert, wenn die Entropie aufgebraucht ist" - Unter Linux hängt es davon ab, wie Sie das Gerät öffnen. Wennopen
Flags enthaltenO_NONBLOCK
, wird es nicht blockiert. Wenn keine Entropie vorhanden ist, kehrt der Aufruf sofort zurück und zeigt 0 gelesene Bytes an./dev/random
nur (ex :) 60 Bytes sinddd
, erhalten Sie eine 60-Byte-Datei. Die Verwendunghead
im selben Szenario sieht wahrscheinlich für immer aus. Sie tun auch nicht, was Sie wollen, aber zumindest für mich ist es offensichtlicher, dass siehead
nicht das tun, was erwartet wurde.Traditionell ist der einzige Unterschied zwischen
/dev/urandom
und der,/dev/random
was passiert, wenn der Kernel glaubt, dass keine Entropie im System vorhanden ist -/dev/random
Fail-Closed,/dev/urandom
Fail-Open. Beide Fahrer wurden Sourcing Entropie ausadd_disk_randomness()
,add_interrupt_randomness()
undadd_input_randomness()
. Siehe/drivers/char/random.c
für Einzelheiten.Bearbeitet, um hinzuzufügen: Ab Linux 4.8
/dev/urandom
wurde CSPRNG überarbeitet.Also wann solltest du scheitern geschlossen? Für jede Art von kryptografischer Verwendung, insbesondere für das Seeding von DRBG. Es gibt ein sehr gutes Papier, in dem die Konsequenzen der Verwendung
/dev/urandom
bei der Erzeugung von RSA-Schlüsseln und bei unzureichender Entropie erläutert werden . Lesen Sie Mining Your Ps und Qs .quelle
Dies ist eine Art "Ich auch" -Antwort, aber es stärkt Tom Hales Empfehlung. Es trifft genau auf Linux zu.
/dev/urandom
/dev/random
Laut Theodore Ts'o auf der Linux-Kernel-Crypto-Mailingliste,
/dev/random
wurde für ein Jahrzehnt veraltet. Von Re: [RFC PATCH v12 3/4] Linux Random Number Generator :Wir testen regelmäßig
/dev/random
und es kommt häufig zu Ausfällen. Der Test führt die drei folgenden Schritte aus: (1) Entleeren/dev/random
durch Abfragen von 10 KB im nicht blockierenden Modus; (2) fordere 16 Bytes im Blockiermodus an (3) versuche, den Block zu komprimieren, um zu sehen, ob er zufällig ist (Test des armen Mannes). Der Test dauert Minuten.Das Problem ist auf Debain-Systemen (i686, x86_64, ARM und MIPS) so schlimm, dass wir GCC Compile Farm gebeten haben, das
rng-tools
Paket für ihre Testmaschinen zu installieren . Von Installiere rng-tools auf gcc67 und gcc68 :Die BSDs und OS X erscheinen in Ordnung. Das Problem ist definitiv Linux.
Erwähnenswert ist auch, dass Linux keine Generatorfehler protokolliert. Sie wollten nicht, dass die Einträge das Systemprotokoll ausfüllen. Bisher sind die meisten Fehler unbemerkt und werden von den meisten Benutzern nicht erkannt.
Die Situation sollte sich in Kürze ändern, da der Kernel mindestens eine Fehlermeldung ausgeben wird. Aus [PATCH] random: Compiler-Warnungen ausschalten und Race auf der Kernel-Crypto-Mailingliste korrigieren :
Der Kompromiss, der später im Thread erreicht wurde, war mindestens ein dmesg pro aufrufendem Modul.
quelle