Entrambi /dev/random
e /dev/urandom
usano un "pool di entropia". Quando il pool si esaurisce, /dev/random
attende che si riempia, il che richiede il monitoraggio del comportamento del sistema (input da tastiera, spostamento del mouse, ecc.), Mentre /dev/urandom
continuerà 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/random
o
/dev/urandom
, probabilmente si desidera utilizzare quest'ultimo. Come regola generale, /dev/urandom
dovrebbe 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/random
interfaccia è 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/random
implementa 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/random
genere 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":
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.
Ai generatori piace /dev/random
e /dev/urandom
che 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/random
produzione 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.
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.