7 Stimmen

Warum wird das Lesen von /dev/random fast immer blockiert?

Ich verwende kubuntu mit Kernel 2.6.38-12-generic

Ich möchte zu Beginn meines Programms 16 Zufallszahlen aus /dev/random lesen. Es blockiert jedoch nach einer relativ kurzen Zeit.

Wie lange dauert es, bis der /dev/random-Puffer gefüllt ist? Warum dauert es so lange, bis er gefüllt ist?

Ich verwende dies als uuid-Generator mit anderen Quellen des Zufalls hinzugefügt, um Samen meinen Mersenne-Twister. Es ist wichtig, dass ich keine Duplikate oder einen doppelten Seed erhalte.

Wenn ich zu /dev/urandom wechsle, funktioniert es gut. Jede Ansicht über die Verwendung von /dev/random über /dev/urandom.

0 Stimmen

18voto

David Schwartz Punkte 172718

Sie sollten wirklich niemals /dev/random . Es sind keine Umstände bekannt, unter denen die Vorteile der /dev/random über /dev/urandom und die Nachteile sind ziemlich offensichtlich.

Der Unterschied besteht darin, dass /dev/urandom liefert "nur" kryptografisch sichere Zufallszahlen, während /dev/random liefert echte Zufallszahlen (zumindest glauben wir das). Es ist jedoch keine Situation bekannt, in der dieser Unterschied eine Rolle spielt, und es gibt keinen bekannten Test, der "echte" Zufälligkeit von lediglich kryptografisch sicherer Zufälligkeit unterscheiden kann.

Ich scherze gewöhnlich, dass /dev/urandom liefert Wasser und /dev/random liefert Weihwasser.

3 Stimmen

Korrekter ist es zu sagen, dass kein bekannter Polynomialzeit-Algorithmus mehr als einen vernachlässigbar kleinen Prozentsatz der Zeit zwischen /dev/urandom und einem echten Zufallsstrom unterscheiden kann.

6voto

Les Manpage de man 4 random beantwortet die Frage:

Wenn sie gelesen wird, wird die /dev/random Gerät liefert nur zufällige w /dev/random sollte für Verwendungen geeignet sein, die eine Zufälligkeit benötigen, wie z. B. One-Time-Pad oder Schlüsselgenerierung. Wenn der Entropie-Pool leer ist, wird von /dev/random w zusätzliche Umgebungsgeräusche gesammelt werden.

Ich bin so überrascht, dass die Leute lieber fragen, als die Manualseiten zu lesen! Sie brauchen nicht einmal das Internet, um die Manpages Ihres Systems zu lesen.

Übrigens wird der Entropie-Pool durch physikalische Phänomene gespeist (abhängig von der Hardware), wie z.B. Mausbewegungen, Tastendrücke, Ethernet-Pakete, etc. Einige wenige Prozessoren haben einen Hardware-Zufallsrauschgenerator (z.B. der RDRAND Maschinenanleitung), und Sie können kaufen beliebige USB-Geräte (siehe auch diese Liste), etc.... Daher das Lesen von /dev/random könnte expansiv sein (oder sogar blockierend). Sie werden es für qualitativ hochwertige Zufälligkeiten (z.B. für kryptographische Schlüssel) oder bei der Initialisierung für das Seeding Ihrer PRNG . Sie sollten erwarten /dev/random eine relativ geringe Bandbreite (z. B. einige Kilobyte oder höchstens ein Megabyte pro Sekunde) und eine hohe Latenzzeit (Dutzende von Millisekunden oder sogar mehr) haben. Die Einzelheiten sind natürlich computerspezifisch.

Lesen Sie auch Thomas Hühns Mythen über /dev/urandom

1 Stimmen

Ich habe dies tatsächlich gelesen. Ich hätte fragen sollen: "Warum leert sich der Entropie-Pool so schnell, wenn ich nur maximal 100 4-Byte-Ints-Zahlen lese? und dann dauert es sehr lange, bis ich viel mehr daraus lesen kann.

2 Stimmen

Der "Entropie-Pool" wird durch physikalische Phänomene (abhängig von der Hardware) gespeist, wie z.B. Mausbewegungen, Tastendrücke, Ethernet-Pakete, etc. Einige wenige Prozessoren haben einen Hardware-Zufallsrauschgenerator (aber nicht alle), aber die meisten haben keinen. Also /dev/random ist teuer!

4voto

moshbear Punkte 3232

Das Lesen von /dev/random ist nicht deterministisch, weil es nur die angeforderte Anzahl von Bits aus dem Zufalls-Pool holt. Es wird blockiert, bis es die angeforderte Anzahl von Bits lesen kann.

/dev/urandom ist jedoch der PRNG des Kernels und kann einen nahezu unendlichen Strom von Pseudo-Zufallszahlen liefern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X