7.1.2. The /dev/random Device (Il Dispositivo /dev/random)
7.1.2. The /dev/random Device (Il Dispositivo /dev/random)
Diverse versioni del sistema operativo UNIX forniscono un generatore di numeri casuali residente nel kernel. Alcuni di questi generatori usano eventi catturati dal kernel durante il normale funzionamento del sistema.
Per esempio, su alcune versioni di Linux, il generatore consiste in un pool casuale di 512 byte rappresentati come 128 parole di 4 byte ciascuna. Quando si verifica un evento, come un interrupt del disco, il tempo dell'evento viene XOR'ato nel pool, e il pool viene mescolato tramite un polinomio primitivo di grado 128. Il pool stesso viene trattato come un buffer circolare, con nuovi dati che vengono XOR'ati (dopo mescolamento con il polinomio) attraverso l'intero pool.
Ogni chiamata che aggiunge entropia al pool stima la quantità di entropia vera probabile che l'input contiene. Il pool stesso contiene un accumulatore che stima l'entropia totale complessiva del pool.
Gli eventi di input provengono da diverse sorgenti, come elencato sotto. Sfortunatamente, per macchine server senza operatori umani, la prima e la terza non sono disponibili, e l'entropia PUÒ essere aggiunta lentamente in quel caso.
-
Interrupt della tastiera. Il tempo dell'interrupt e il codice di scansione vengono aggiunti al pool. Questo in effetti aggiunge entropia dall'operatore umano misurando i tempi di arrivo inter-pressione.
-
Completamento del disco e altri interrupt. Un sistema usato da una persona avrà probabilmente un pattern difficile da prevedere di accessi al disco. (Ma non tutti i driver del disco supportano la cattura di queste informazioni di temporizzazione con accuratezza sufficiente per essere utili.)
-
Movimento del mouse. La temporizzazione e la posizione del mouse vengono aggiunte.
Quando sono richiesti byte casuali, il pool viene hashato con SHA-1 [SHA*] per produrre i byte di casualità restituiti. Se sono richiesti più byte dell'output di SHA-1 (20 byte), allora l'output hashato viene rimescolato nel pool e viene eseguito un nuovo hash per ottenere i successivi 20 byte. Man mano che i byte vengono rimossi dal pool, la stima di entropia viene corrispondentemente decrementata.
Per assicurare un pool ragionevolmente casuale all'avvio del sistema, gli script standard di avvio e spegnimento salvano il pool in un file su disco allo spegnimento e leggono questo file all'avvio del sistema.
Ci sono due interfacce esportate all'utente. /dev/random restituisce byte dal pool ma si blocca quando l'entropia stimata scende a zero. Man mano che l'entropia viene aggiunta al pool dagli eventi, più dati diventano disponibili tramite /dev/random. I dati casuali ottenuti da tale dispositivo /dev/random sono adatti per la generazione di chiavi per chiavi a lungo termine, se abbastanza bit casuali sono nel pool o vengono aggiunti in un tempo ragionevole.
/dev/urandom funziona come /dev/random; tuttavia, fornisce dati anche quando la stima di entropia per il pool casuale scende a zero. Questo PUÒ essere adeguato per chiavi di sessione o per altri compiti di generazione di chiavi per i quali il blocco in attesa di più bit casuali non è accettabile. Il rischio di continuare a prendere dati anche quando la stima di entropia del pool è piccola è che l'output passato PUÒ essere calcolabile dall'output corrente, purché un attaccante possa invertire SHA-1. Dato che SHA-1 è progettato per essere non invertibile, questo è un rischio ragionevole.
Per ottenere numeri casuali sotto Linux, Solaris o altri sistemi UNIX equipaggiati con codice come descritto sopra, tutto ciò che un'applicazione DEVE fare è aprire /dev/random o /dev/urandom e leggere il numero desiderato di byte.
(Il dispositivo Random di Linux è stato scritto da Theodore Ts'o. Era basato vagamente sul generatore di numeri casuali in PGP 2.X e PGP 3.0 (alias PGP 5.0).)