Wann soll / dev / random vs / dev / urandom verwendet werden?


Antworten:


79

TL; DR

Verwenden Sie /dev/urandomfür die meisten praktischen Zwecke.

Die längere Antwort hängt von der Version von Unix ab, die Sie verwenden.

Linux

Historisch /dev/randomund /dev/urandomwurden beide gleichzeitig eingeführt.

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.

In Summe:

  • Die Manpage ist irreführend
  • 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.
  • Verwenden Sie /dev/urandom.

Ausnahmen von der Regel

In der Kryptografie des Stapelaustausch Wann verwendet man /dev/randomüber /dev/urandomin Linux @otus gibt zwei Anwendungsfälle :

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

  2. 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/urandomnur dann ausliest und blockiert, wenn die ursprüngliche Seed-Entropie nicht verfügbar ist.

Es gibt Probleme bei der Änderung /dev/urandomder Verwendunggetrandom() , aber es ist denkbar, dass ein neues /dev/xrandomGerät basierend auf erstellt wird getrandom().

Mac OS

Es spielt keine Rolle, wie Wikipedia sagt :

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.

FreeBSD

Es spielt keine Rolle, wie Wikipedia sagt :

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

Die rnd (4) Manpage sagt :

/dev/urandom Blockiert niemals.

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


5

Dies ist eine Art "Ich auch" -Antwort, aber es stärkt Tom Hales Empfehlung. Es trifft genau auf Linux zu.

  • Verwenden /dev/urandom
  • Nicht verwenden /dev/random

Laut Theodore Ts'o auf der Linux-Kernel-Crypto-Mailingliste, /dev/randomwurde für ein Jahrzehnt veraltet. Von Re: [RFC PATCH v12 3/4] Linux Random Number Generator :

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.

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 :

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.