Sollte ich "/ dev / random" oder "/ dev / urandom" verwenden, wenn große Datenmengen benötigt werden?

1105
CBHacking

Manchmal möchte ich sehr zufällige Daten, zum Beispiel, um eine Datei oder sogar eine ganze Festplatte zu überschreiben. Soll ich verwenden /dev/randomoder /dev/urandom? Was sind die Vor- oder Nachteile von jedem? Gibt es eine bessere Alternative?

6
Schön zu sehen, dass du das gepostet hast! JakeGould vor 8 Jahren 0

1 Antwort auf die Frage

11
CBHacking

Für große Datenmengen müssen Sie verwenden /dev/urandom. Das uist für "unbegrenzt", dh es stehen immer Daten zur Verfügung. Wenn Sie versuchen, viele Daten auszulesen /dev/random, werden diese blockiert, sodass Ihr Programm eine Zeitlang nicht läuft.

Beides /dev/randomund /dev/urandomliefern unvorhersehbare (zufällige) Daten. Die Daten von /dev/randomsind völlig unvorhersehbar (oder wirklich zufällig ) und eignen sich daher für langfristige kryptographische Schlüssel (bei denen ein Angreifer in der Zukunft die Vorteile umfangreicher Recherchen haben kann und schnellere Computer versuchen, den Algorithmus zu brechen verwendet, um die Daten zu generieren). Die Daten von /dev/urandombasieren auf wirklich zufälligen Daten, können jedoch durch eine qualitativ hochwertige Pseudozufallsfunktion durchlaufen werden, um zusätzliche Daten zu erzeugen. Es ist immer noch für Dinge wie Verschlüsselungsschlüssel geeignet, solange Sie nicht sicher sein müssen, dass sie über Jahrzehnte nicht beschädigt werden, sondern auch für Massendaten verwendet werden können.

Der Linux-Kernel unterhält einen "Entropie-Pool" nicht vorhersagbarer Daten, wobei jedes Bit die gleiche Chance hat, wahr oder falsch (Eins oder Null) zu sein. Der Kernel baut diesen Entropiepool aus verschiedenen Eingaben auf, z. B. Hardwarequellen, Treiber, Benutzeraktionen und anderen Faktoren, die nicht zuverlässig vorhergesagt werden können. Diese Quellen benötigen jedoch Zeit, um Entropie zu akkumulieren, sodass der Entropiepool erschöpft werden kann, wenn er zu schnell verbraucht wird.

/dev/randomzieht direkt aus dem Entropiepool. Wenn der Pool erschöpft ist, werden durch das Lesen von /dev/randomDaten keine weiteren Daten zurückgegeben, bis der Pool ausreichend gefüllt ist, was einige Zeit in Anspruch nehmen kann. /dev/urandomverwendet einen kryptografisch sicheren Pseudo-Zufallszahlengenerator (CSPRNG), der aus dem Entropie-Pool stammt. Es kann eine unendliche Menge an Ausgabe erzeugen, die Ausgabe kann jedoch nicht vorhergesagt werden, ohne den internen Zustand des CSPRNG zu kennen. Da der interne Zustand anfangs auf wirklich zufälligen Daten basiert und der verwendete CSPRNG-Algorithmus seinen internen Zustand nicht durch seine Ausgabe verliert, /dev/urandomist er dennoch eine gute Quelle für höchst zufällige Daten.

Um es zusammenzufassen, wenn Sie maximal zufällige Daten benötigen, verwenden Sie /dev/random. Wenn Sie jedoch viele Daten benötigen, müssen Sie diese verwenden /dev/urandom. Verwenden /dev/urandomSie im Allgemeinen die Verwendung, es sei denn, Sie benötigen die Daten, um für Jahrzehnte nicht von wirklich zufälligem Rauschen unterschieden zu werden.

Ich dachte, das U steht für "Unblocked", aber das ist ein Detail. Gute Antwort! Wouter Verhelst vor 8 Jahren 0
Wikipedia behauptet "unbegrenzt" mit einem Zitat der Kernel-Funktion [`random_read_unlimited`] (http://repo.or.cz/w/davej-history.git/blob/d0562c8dc:/drivers/char/random.c# 682), aber "unblocked" macht auch durchaus Sinn. Laut Manpage können Sie sowieso nicht mehr als 32 MB aus "/ dev / urandom" in einem einzigen Lesevorgang erhalten. CBHacking vor 8 Jahren 0
Ich war immer davon ausgegangen, dass das u für unsignierte war, als ob in vielen Sprachen ein unsigniertes int ist. Sehr informativ, danke Patrick L vor 5 Jahren 0