Warum ist mein / dev / random bei der Verwendung von dd so langsam?

29

Ich versuche, eine Reihe von Festplatten halb sicher zu löschen. Folgendes arbeitet mit 20-50Mb / s

dd if=/dev/zero of=/dev/sda

Aber

dd if=/dev/random of=/dev/sda 

scheint nicht zu funktionieren. Auch wenn ich tippe

dd if=/dev/random of=stdout

Es gibt mir nur ein paar Bytes, unabhängig davon, was ich für bs = und count = übergeben habe

Benutze ich / dev / random falsch? Nach welchen anderen Informationen sollte ich suchen, um diese Problembehandlung voranzutreiben? Gibt es eine andere Möglichkeit, dies mit einem Skript oder ähnlichem zu tun?

makeMyLifeEasy | dd if=stdin of=/dev/sda

Oder etwas ähnliches...

Mikey
quelle
1
Nur als Hinweis: Sofern Sie nicht den Verdacht haben, dass die CIA Ihren Daten nachgeht, reicht wahrscheinlich ein einzelnes Überschreiben mit Nullen (/ dev / zero) aus. Siehe zB superuser.com/questions/215852/… für eine Diskussion.
sleske
Was , warum aus der Lektüre /dev/randomliefert nur ein paar Bytes, siehe superuser.com/a/712515/139307
mklement0

Antworten:

42

Beides /dev/randomund /dev/urandomein "Entropie-Pool". Wenn der Pool erschöpft ist, /dev/randomwartet er darauf, dass er wieder aufgefüllt wird. Dies erfordert eine Überwachung des Systemverhaltens (Tastatureingabe, Mausbewegung usw.), während Sie /dev/urandomweiterhin pseudozufällige Daten erhalten. /dev/randomist theoretisch von höherer Qualität, aber /dev/urandommit ziemlicher Sicherheit gut genug für Ihre Zwecke. (Aber es /dev/urandomist wahrscheinlich sogar langsamer als einige andere Methoden. Ein schnellerer, aber qualitativ schlechterer Generator ist wahrscheinlich gut genug, um Festplatten zu löschen. Es ist nicht klar, dass ein Angreifer einen Vorteil daraus ziehen würde, die zu erzeugende Sequenz zu kennen, oder dass Zufallszahlen für diesen Zweck besser sind als eine Folge wie 0, 1, 2, 3, 4, ....)

Zitieren der random(4)Manpage:

Wenn Sie sich nicht sicher sind, ob Sie /dev/randomoder verwenden sollen /dev/urandom, möchten Sie wahrscheinlich letzteres verwenden. In der Regel /dev/urandomsollte für alles außer langlebigen GPG / SSL / SSH-Schlüsseln verwendet werden.

UPDATE : Die Manpage `random (4) wurde aktualisiert, seit ich das geschrieben habe. Es heißt jetzt:

Die /dev/randomSchnittstelle wird als Legacy-Schnittstelle betrachtet und /dev/urandomist in allen Anwendungsfällen bevorzugt und ausreichend, mit Ausnahme von Anwendungen, die während der frühen Startzeit Zufälligkeiten erfordern. für diese Anwendungen getrandom(2)muss stattdessen verwendet werden, da es blockiert, bis der Entropiepool initialisiert wird.

Siehe auch " Mythen über / dev / urandom " von Thomas Hühn.

Aber /dev/urandom, auch wenn es nicht blockiert wird, ist wahrscheinlich zu langsam sein , wenn Sie große Mengen an Daten generieren möchten. Nehmen Sie einige Messungen an Ihrem System vor, bevor Sie es versuchen.

BEARBEITEN: Das Folgende ist ein Exkurs über "wahre" Zufallszahlen im Vergleich zu Pseudo-Zufallszahlen. Wenn alles, was Sie interessiert, eine praktische Antwort auf die Frage ist, können Sie jetzt aufhören zu lesen.

Ich scheine Behauptungen (auch in anderen Antworten hier), /dev/randomdie einen "wahren" Zufallszahlengenerator im Gegensatz zu einem Pseudozufallszahlengenerator (PRNG) implementieren. Beispielsweise macht der Wikipedia-Artikel einen solchen Anspruch geltend. Ich glaube nicht, dass das stimmt. Es gibt hier einige Diskussionen darüber , die sich auf Hardware-Zufallszahlengeneratoren beziehen, aber ich sehe keine Beweise dafür, dass /dev/randomnormalerweise ein solches Gerät verwendet wird oder dass typische Computer sogar über ein solches Gerät verfügen. Sie unterscheiden sich von PRNGs wie der C- rand()Funktion darin, dass sie nicht deterministisch sind, da sie Entropie aus praktisch unvorhersehbaren Quellen gewinnen.

Ich würde sagen, es gibt drei Klassen von Zufallszahlengeneratoren:

  1. Deterministische PRNGs wie die C- rand()Funktion, die einen Algorithmus verwenden, um wiederholbare Sequenzen zu generieren, die (mehr oder weniger) die statistischen Eigenschaften einer wirklich zufälligen Sequenz haben. Diese können für Spiele gut genug sein (vorausgesetzt, sie lassen sich auf eine gute Art und Weise aussondern) und sind für Anwendungen erforderlich, die Wiederholbarkeit erfordern, jedoch nicht für die Kryptografie geeignet sind.

  2. Generatoren wie /dev/randomund /dev/urandom, die Entropie aus einer praktisch unvorhersehbaren Quelle wie der E / A-Aktivität gewinnen (aus diesem Grund kann das Klopfen auf der Tastatur oder das Bewegen der Maus dazu führen /dev/random, dass mehr Daten erzeugt werden). Es ist (für mich) nicht klar, ob diese der Definition eines PRNG entsprechen (ich habe Definitionen gesehen, die besagen, dass ein PRNG deterministisch ist), aber sie sind auch keine echten Zufallszahlengeneratoren.

  3. Hardware-Zufallszahlengeneratoren , die selbst bei vollständiger Kenntnis ihres Ausgangszustands physikalisch unvorhersehbar sind und die zusätzlich mathematische Techniken verwenden, um die richtigen statistischen Eigenschaften sicherzustellen.

Keith Thompson
quelle
2
Sogar / dev / urandom ist etwas langsamer, wenn Sie sehr viel Speicherplatz benötigen (wie ganze Partitionen, bevor Sie verschlüsselte Dateisysteme darauf erstellen). Dies sollte als kleine Ergänzung zur hervorragenden Antwort und detaillierten Erklärung verstanden werden.
Vtest
Da Sie nicht mehr als ein Bit Entropie aus einem zufälligen Bit berechnen / ableiten / erstellen / ... können, ist alles, was mehr 'zufällige' Bits erzeugt / ausgibt, als es als Eingabe empfangen wird, per Definition bestenfalls pseudozufällig. Daher ist /dev/urandomeindeutig pseudozufällig. /dev/randomunterscheidet sich darin, dass es versucht, eine konservative Schätzung der Entropie seiner Eingabe vorzunehmen, und nicht mehr Entropie ausgibt, als es tatsächlich kann (denkt es). Dies ist unabhängig vom Vorhandensein eines dedizierten TRNG-Geräts, da eine echte Entropie auch von unabhängigen Ereignissen jeglicher Art wie Tastatur oder Netzwerk-E / A über der Zeit erhalten werden kann.
JimmyB
13

/dev/randomist eine Quelle wahrer Entropie, wahrhaft zufälliger Bytes. Als solches braucht es eine Quelle der Zufälligkeit. Sie können die Zufälligkeit "aufbrauchen", indem Sie daraus lesen. Es wird dir all die Zufälligkeit geben, die es hat, und dann blocken, bis es mehr wird. Sie sitzen wahrscheinlich nur da und warten, und die Maschine bekommt sehr wenig neue Zufälligkeit und wartet nur.

/dev/randomfür wirklich zufällige Krypto, hohe Qualität der Zufälligkeit. Als solches ist es ein Overkill, wenn ein Laufwerk überschrieben wird. /dev/zeroEin paar Mal zu schreiben ist in Ordnung. Oder Sie können von schreiben /dev/urandom, was nicht blockiert und Pseudo-Zufallszahlen gibt, wenn es keine echte Zufälligkeit mehr gibt.

Reiche Homolka
quelle
10
Nein, /dev/randomgeneriert keine "wirklich zufälligen Bytes". Es erzeugt höherwertige Pseudo- Zufallsbytes als dies der /dev/urandomFall ist.
Keith Thompson
7

In Linux ist / dev / random eine spezielle Datei, die qualitativ hochwertige Pseudozufallszahlen liefert. Diese Implementierung sammelt Entropie von Ereignissen, die von Tastatur-, Maus-, Festplatten- und Systeminterrupts stammen. (siehe dieses Dokument) Wenn es keine derartigen Ereignisse gibt, ist der Entropiepool leer. Die Lesevorgänge von / dev / random werden blockiert, bis zusätzliches Umgebungsrauschen erfasst wird. Dies erklärt Ihr Problem. Um den Entropiepool zu füllen, können Sie Tasten auf der Tastatur drücken.

Andererseits verwendet ein echter Zufallszahlengenerator einen Hardware-Zufallszahlengenerator, der Zufallszahlen aus physikalischen Prozessen erzeugt. Diese Prozesse umfassen mikroskopische Phänomene, die ein statistisch zufälliges "Rauschsignal" mit niedrigem Pegel erzeugen, wie beispielsweise thermisches Rauschen oder den fotoelektrischen Effekt oder andere physikalische Phänomene. Diese Prozesse sind theoretisch völlig unvorhersehbar, und die Behauptungen der Theorie zur Unvorhersehbarkeit werden einem experimentellen Test unterzogen.

Ein Hardware-Zufallszahlengenerator besteht typischerweise aus einem Wandler, um einen Teil der physikalischen Phänomene in ein elektrisches Signal umzuwandeln, einem Verstärker und anderen elektronischen Schaltungen, um die Amplitude der Zufallsschwankungen auf ein makroskopisches Niveau zu erhöhen, und einer Art von Analog-Digital-Wandler Um die Ausgabe in eine digitale Zahl, häufig eine einfache Binärzahl 0 oder 1, umzuwandeln. Durch wiederholtes Abtasten des zufällig variierenden Signals wird eine Reihe von Zufallszahlen erhalten.

Der Hardware-Zufallszahlengenerator sammelt Umgebungsgeräusche von Gerätetreibern und anderen Quellen in einem Entropiepool. Aus diesem Entropiepool werden Zufallszahlen erzeugt. Beim Lesen gibt das Gerät / dev / random nur zufällige Bytes innerhalb der geschätzten Anzahl von Rauschbits im Entropiepool zurück. Dies erklärt Ihr Problem.

Einige Implementierungen von Hardware RNG werden im Kerneldokument und in den Informationen zu einem Gerät erläutert .

Ein Gegenstück zu / dev / random ist / dev / urandom ("entsperrte" / nicht blockierende zufällige Quelle), die den internen Pool wiederverwendet, um mehr pseudozufällige Bits zu erzeugen. Dies bedeutet, dass der Aufruf nicht blockiert wird, die Ausgabe jedoch möglicherweise weniger Entropie enthält als der entsprechende Lesevorgang aus / dev / random.

Wenn Sie also nicht beabsichtigen, CSPRNG (Cryptographically Secure Pseudorandom Number Generator) zu generieren, sollten Sie / dev / urandom verwenden.

Sachin Divekar
quelle
Hat /dev/randomwirklich Quellen wie thermisches Rauschen verwenden? Nach meinem Verständnis werden Informationen aus (relativ) unvorhersehbaren Systemstatus verwendet, z. B. E / A-Aktivität und Prozessstatus. Ich glaube nicht, dass die meisten Linux-Systeme über Hardware verfügen, die thermisches Rauschen abfangen kann. Können Sie dazu einige Unterlagen anführen?
Keith Thompson
ja, du hast recht. Die Informationen, die ich erwähnt habe, gelten für den generischen Hardware-Zufallszahlengenerator.
Sachin Divekar
Schauen Sie sich die doc, wie es in Linux auf implementiert Link . Dort wird erwähnt, dass in einer PC-Umgebung der LRNG Entropie von Ereignissen sammelt, die von Tastatur-, Maus-, Platten- und System-Interrupts herrühren. In anderen Umgebungen sammelt das LRNG Entropie von den verfügbaren Ressourcen. Ein OpenWRT-Router enthält beispielsweise keine Festplatte, Maus und Tastatur und kann daher nicht als Entropiequelle verwendet werden. Andererseits sammelt der Router Entropie von Netzwerkereignissen.
Sachin Divekar
Vielleicht könnten Sie Ihre Antwort aktualisieren. Ich glaube nicht, dass es richtig ist zu sagen, dass es /dev/random"wirklich zufällige Zahlen" erzeugt.
Keith Thompson
Im / dev / random- Artikel auf Wikipedia heißt es, Linux habe als erstes Betriebssystem im ersten Absatz einen echten Zufallszahlengenerator auf diese Weise implementiert.
Sachin Divekar
2

Ohne Beantwortung Ihrer Frage - hier gibt es bereits vollständige Antworten - können Sie auch Dariks Boot und Nuke alias DBAN , einen Wischer für ein Live-CD-Laufwerk, ausprobieren.

Randy Orrison
quelle
0

Verwenden Sie einfach den shredBefehl, der mit coreutils geliefert wird. Es verwendet zufällige Daten auf effiziente Weise. dd ist ein Low-Level-Tool und das ist wahrscheinlich ein bisschen zu niedrig für diese Aufgabe. shredüberspringt effizient nicht beschreibbare Teile des Geräts.

Pixelbeat
quelle