Ho letto più e più volte su come /dev/random
ottiene la sua entropia da "eventi hardware". Quali sono esattamente questi eventi hardware e come possiamo essere sicuri che sia abbastanza casuale?
Ho letto più e più volte su come /dev/random
ottiene la sua entropia da "eventi hardware". Quali sono esattamente questi eventi hardware e come possiamo essere sicuri che sia abbastanza casuale?
Come dice @Rook, un buon punto di partenza è il codice sorgente del kernel stesso, precisamente il drivers/char/random.c
file. Inizia con una lunga descrizione (come commenti), incluso questo passaggio:
Sources of randomness from the environment include inter-keyboard timings, inter-interrupt timings from some interrupts, and other events which are both (a) non-deterministic and (b) hard for an outside observer to measure.
Il principale cavallo di battaglia per il gatherer di entropy è la funzione add_interrupt_randomness()
, che deve essere invocata per ciascuna (o almeno la maggior parte) interruzioni. Un interrupt è il metodo principale con cui un componente hardware rende noto alla CPU che ha cambiato stato, ad es. che alcuni nuovi dati sono disponibili o, analogamente, che l'hardware è pronto per elaborare nuovi dati dalla CPU. Per esempio. si otterrà un'interruzione ogni volta che si preme o si rilascia un tasto, o si sposta il mouse o si riceve un pacchetto di rete. Otterrete anche interruzioni dal timer e da molte altre fonti. "Entropia" si ottiene principalmente misurando il tempo esatto in cui viene ricevuto l'interrupt: la CPU moderna ha un contatore di cicli che può essere usato per ottenere una nozione di tempo fino alla precisione del nanosecondo (precisione, non precisione, ma è abbastanza buono qui). Anche il tipo di interrupt è incluso nel mix, ma la maggior parte dell'entropia deriva da questi conteggi dei cicli.
Ricorda che "l'entropia" può essere definita come "ciò che l'attaccante non sa". Attraverso misure esterne e simulazione, l'utente malintenzionato può ottenere alcune nozioni su cosa accade e quando nel kernel, ma entro alcuni limiti. Ad esempio, l'attaccante può misurare il tempo di arrivo di un pacchetto di rete fino al microsecondo; mancherà ancora 10 bit di entropia se il kernel misura quel tempo fino al nanosecondo.
Oltre agli interrupt, altre parti del kernel (ad es. driver di dispositivo) possono inviare dati aggiuntivi nel pool chiamando add_input_randomness()
, nel caso in cui tali driver abbiano accesso a dati considerati "casuali" in qualche modo (precisamente, in un modo in cui gli attaccanti non possono indovinare).
Da area utente, puoi anche inviare manualmente i dati scrivendo in /dev/random
. Una buona fonte sono le immagini di una webcam: sono molti dati con un sacco di rumore termico. Le distribuzioni Linux utilizzano questa possibilità di "entropy external push" per mantenere l'entropia attraverso i riavvii: quando la macchina si avvia, inietta un "file seme" che viene immediatamente ricreato da /dev/urandom
. Pertanto, una grande fonte di entropia per /dev/random
è l'entropia ottenuta dalle precedenti incarnazioni di /dev/random
(prima dell'ultimo avvio).