Perché my / dev / random è così lento quando si usa dd?


29

Sto cercando di cancellare in modo semi-sicuro un mucchio di dischi rigidi. Di seguito funziona a 20-50 Mb / s

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

Ma

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

sembra non funzionare. Anche quando scrivo

dd if=/dev/random of=stdout

Mi dà solo pochi byte, indipendentemente da cosa lo passo per bs = e count =

Sto usando / dev / random sbagliato? Quali altre informazioni dovrei cercare per portare avanti questa risoluzione dei problemi? C'è un altro modo per farlo con una sceneggiatura o qualcosa del genere

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

O qualcosa di simile...


1
Proprio come una nota: a meno che non sospetti che la CIA segua i tuoi dati, una singola sovrascrittura con zeri (/ dev / zero) è probabilmente sufficiente. Vedi ad esempio superuser.com/questions/215852/… per una discussione.
sleske,

Per quanto riguarda il motivo per cui la lettura da /dev/randomrestituisce solo pochi byte, vedere superuser.com/a/712515/139307
mklement0

Risposte:


42

Entrambi /dev/randome /dev/urandomusano un "pool di entropia". Quando il pool si esaurisce, /dev/randomattende che si riempia, il che richiede il monitoraggio del comportamento del sistema (input da tastiera, spostamento del mouse, ecc.), Mentre /dev/urandomcontinuerà a fornire dati pseudo-casuali. /dev/randomè teoricamente di qualità superiore, ma /dev/urandomè quasi certamente abbastanza buono per i tuoi scopi. (Ma /dev/urandomè probabile che sia anche più lento di altri metodi. Un generatore più veloce, ma di qualità inferiore è probabilmente abbastanza buono per cancellare i dischi rigidi. Non è chiaro che un attaccante trarrebbe vantaggio dalla conoscenza della sequenza che verrà generata, o che i numeri casuali sono migliori a questo scopo di una sequenza come 0, 1, 2, 3, 4, ....)

Citando la random(4)pagina man:

Se non si è sicuri dell'opportunità di utilizzare /dev/randomo /dev/urandom, probabilmente si desidera utilizzare quest'ultimo. Come regola generale, /dev/urandomdovrebbe essere usato per tutto tranne chiavi GPG / SSL / SSH di lunga durata.

AGGIORNAMENTO : La pagina man `random (4) è stata aggiornata da quando l'ho scritta. Ora dice:

L' /dev/randominterfaccia è considerata un'interfaccia legacy ed /dev/urandomè preferita e sufficiente in tutti i casi d'uso, ad eccezione delle applicazioni che richiedono casualità durante l'avvio iniziale; per queste applicazioni, è getrandom(2)necessario utilizzare invece, poiché si bloccherà fino all'inizializzazione del pool di entropia.

Vedi anche " Miti su / dev / urandom " di Thomas Hühn.

Ma /dev/urandom, anche se non si bloccherà, è probabile che sia troppo lento se si desidera generare enormi quantità di dati. Prendi alcune misure sul tuo sistema prima di provarlo.

EDIT: Di seguito è riportata una digressione su numeri casuali "veri" vs. numeri pseudo-casuali. Se tutto ciò che ti interessa è una risposta pratica alla domanda, puoi smettere di leggere ora.

Mi sembra di affermare (anche in altre risposte qui) che /dev/randomimplementa un generatore di numeri casuali "vero", al contrario di un generatore di numeri pseudo-casuali (PRNG). Ad esempio, l' articolo di Wikipedia afferma tale affermazione. Non credo sia corretto. C'è qualche discussione qui che si riferisce ai generatori di numeri casuali di hardware, ma non vedo alcuna prova che in /dev/randomgenere utilizza un tale dispositivo o che i computer tipici abbiano persino un tale dispositivo. Differiscono dai PRNG come la rand()funzione C in quanto non sono deterministici, poiché raccolgono entropia da fonti praticamente imprevedibili.

Direi che ci sono tre classi di generatori di numeri "casuali":

  1. PRNG deterministici, come la rand()funzione di C , che usano un algoritmo per generare sequenze ripetibili che hanno (più o meno) le proprietà statistiche di una sequenza veramente casuale. Questi possono essere abbastanza buoni per i giochi (dato un buon modo di seminarli) e sono necessari per applicazioni che richiedono ripetibilità, ma non sono adatti per la crittografia.

  2. Ai generatori piace /dev/randome /dev/urandomche raccolgono entropia da una fonte praticamente imprevedibile come l'attività di I / O (questo è il motivo per cui martellare la tastiera o muovere il mouse può causare la /dev/randomproduzione di più dati). Non è chiaro (per me) se questi soddisfano la definizione di un PRNG (ho visto definizioni che dicono che un PRNG è deterministico), ma nemmeno i veri generatori di numeri casuali.

  3. Generatori di numeri casuali hardware che sono fisicamente imprevedibili anche con una conoscenza completa del loro stato iniziale e che utilizzano inoltre tecniche matematiche per garantire le giuste proprietà statistiche.


2
Anche / dev / urandom è un po 'lento se devi riempire enormi quantità di spazio su disco (come intere partizioni, prima di creare su di essi file system crittografati). Questo dovrebbe essere preso come una piccola aggiunta alla risposta eccellente e alla spiegazione dettagliata.
vtest

Dal momento che non è possibile calcolare / derivare / creare / ... più di un bit di entropia da un bit casuale, tutto ciò che genera / genera più bit "casuali" di quelli che ha ricevuto come input è per definizione pseudo-casuale nella migliore delle ipotesi. Quindi, /dev/urandomchiaramente è pseudo-casuale. /dev/randomdifferisce dal fatto che cerca di fare una stima conservativa dell'entropia del suo input e non produce più entropia di quanto (pensi) in realtà possa fare. Ciò è indipendente dalla presenza di un dispositivo TRNG dedicato, perché la vera entropia può essere ottenuta anche da eventi indipendenti di qualsiasi tipo, come tastiera o IO di rete o tempo.
JimmyB,

13

/dev/randomè una fonte di vera entropia, byte veramente casuali. Come tale, ha bisogno di una fonte di casualità. Puoi "esaurire" la casualità leggendola. Ti darà tutta la casualità che ha, quindi bloccherà fino a quando non ne otterrà di più. Probabilmente stai solo seduto lì ad aspettare, e la macchina ottiene pochissima nuova casualità, e aspetta solo.

/dev/randomper crittografia veramente casuale, casualità di alta qualità. Come tale, è un overkill per la sovrascrittura di un'unità disco. Scrivere da /dev/zeropoche volte va bene. Oppure puoi scrivere da /dev/urandom, che non bloccherà e darà numeri pseudo-casuali quando si esaurisce la casualità vera.


10
No, /dev/randomnon genera "byte veramente casuali". Genera byte pseudo- casuali di qualità superiore rispetto a /dev/urandom.
Keith Thompson,

7

In Linux / dev / random è un file speciale che serve numeri pseudo casuali di alta qualità. Questa implementazione raccoglie entropia da eventi originati da interruzioni di tastiera, mouse, disco e sistema. (fare riferimento a questo documento) Quindi quando non ci sono tali eventi, il pool di entropia è vuoto, le letture da / dev / random si bloccano fino a quando non viene raccolto ulteriore rumore ambientale. Questo spiega il tuo problema. Per riempire il pool di entropia è possibile premere i tasti sulla tastiera.

D'altra parte, un generatore di numeri casuali utilizza un generatore di numeri casuali hardware che genera numeri casuali da processi fisici, tra cui fenomeni microscopici che generano un segnale di "rumore" statisticamente casuale di basso livello, come il rumore termico o l'effetto fotoelettrico o altri fenomeni fisici. Questi processi sono, in teoria, completamente imprevedibili e le asserzioni di imprevedibilità della teoria sono soggette a test sperimentali.

Un generatore di numeri casuali hardware in genere è costituito da un trasduttore per convertire alcuni aspetti dei fenomeni fisici in un segnale elettrico, un amplificatore e altri circuiti elettronici per aumentare l'ampiezza delle fluttuazioni casuali a un livello macroscopico e un qualche tipo di convertitore da analogico a digitale per convertire l'output in un numero digitale, spesso una semplice cifra binaria 0 o 1. Campionando ripetutamente il segnale che varia casualmente, si ottiene una serie di numeri casuali.

Il generatore di numeri casuali hardware raccoglie il rumore ambientale proveniente dai driver di dispositivo e da altre fonti in un pool di entropia. Da questo pool di entropia vengono creati numeri casuali. Quando viene letto, il dispositivo / dev / random restituirà solo byte casuali entro il numero stimato di bit di rumore nel pool di entropia. Questo spiega il tuo problema.

Alcune implementazioni di Hardware RNG sono spiegate nel documento del kernel e nelle informazioni su un dispositivo .

Una controparte di / dev / random è / dev / urandom (sorgente casuale "sbloccata" / non bloccante) che riutilizza il pool interno per produrre più bit pseudo-casuali. Ciò significa che la chiamata non si bloccherà, ma l'output potrebbe contenere meno entropia della lettura corrispondente da / dev / random.

Quindi se il tuo intento non è generare CSPRNG (generatore di numeri pseudocasuali crittograficamente sicuro), dovresti usare / dev / urandom.


Fa /dev/randomdavvero usare fonti come il rumore termico? La mia comprensione è che utilizza informazioni provenienti dallo stato del sistema (relativamente) imprevedibile, come l'attività di I / O e lo stato del processo. Non credo che la maggior parte dei sistemi Linux disponga di hardware in grado di raccogliere rumori termici. Puoi citare un po 'di documentazione su questo?
Keith Thompson,

si hai ragione. Le informazioni che ho menzionato sono applicabili al generatore di numeri casuali hardware generico.
Sachin Divekar,

Guarda il documento su come è implementato in linux al link . Qui si dice che in un ambiente PC, l'LRNG raccoglie entropia da eventi originati da interruzioni di tastiera, mouse, disco e sistema. In altri ambienti, LRNG raccoglie l'entropia dalle risorse disponibili. Ad esempio, un router OpenWRT non include un disco rigido, mouse e tastiera e pertanto questi non possono essere utilizzati come origini di entropia. D'altra parte, il router raccoglie l'entropia dagli eventi di rete.
Sachin Divekar,

Forse potresti aggiornare la tua risposta. Non credo sia corretto affermare che /dev/randomgenera "numeri veramente casuali".
Keith Thompson,

L'articolo / dev / random su Wikipedia afferma che Linux è stato il primo sistema operativo a implementare un vero generatore di numeri casuali in questo modo nel primo paragrafo.
Sachin Divekar,

2

Senza rispondere alla tua domanda - ci sono già risposte complete qui - puoi anche dare un'occhiata a Darik's Boot e Nuke aka DBAN che è un tergicristallo per unità CD live.


0

Basta usare il shredcomando fornito con coreutils. Utilizza i dati casuali in modo efficiente. dd è uno strumento di basso livello e probabilmente è un livello un po 'troppo basso per questo compito. shredsalterà in modo efficiente parti non scrivibili del dispositivo, ad esempio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.