# /dev/random

Nei sistemi operativi Unix e Unix-like, /dev/random (random device, dispositivo casuale) è un dispositivo virtuale (ossia non fisicamente presente su memoria di massa) con la caratteristica di restituire un valore numerico casuale o pseudo-casuale ogni volta che vi si accede. Consente di accedere al rumore ambientale raccolto dai dispositivi collegati e da altre sorgenti. /dev/random viene utilizzato per esempio per il test di applicazioni che operano su numeri casuali, o come sistema per individuare errori di programmazione (bug) su input casuali. Può essere impiegato anche per simulare il "rumore" (vale a dire la presenza di dati non corretti) nelle sequenze di input verso i driver di periferica. Un diverso utilizzo si ha nel campo della crittografia dove /dev/random può essere utilizzato per generare chiavi crittografiche casuali sia ad uso del sistema operativo che delle applicazioni.
Non tutti i sistemi operativi implementano la stessa semantica per /dev/random. Linux è stato il primo sistema Unix-like a implementare /dev/random come generatore di numeri casuali. Implementazioni simili si trovano in FreeBSD, Solaris, macOS, NetBSD, OpenBSD, Tru64 UNIX 5.1B, AIX 5.2, e HP-UX 11i v2. Nei sistemi Windows della famiglia NT funzioni simili vengono svolte dal file ksecdd.sys.

## Linux

La generazione di numeri casuali dal kernel è stata implementata per la prima volta in Linux nel 1994 da Theodore Ts'o.. L'implementazione usa hash sicuri al posto di un cifrario per evitare problemi legali che erano presenti al momento del progetto. L'implementazione tiene anche conto del fatto che un certo hash o cifrario potrebbe essere scoperto essere debole, e quindi il progetto è protetto contro ogni tale debolezza.
In questa implementazione, il generatore mantiene una stima del numero di bit di rumore nella entropy pool. Da questa entropy pool i numeri casuali sono creati. Quando viene letto, /dev/random restituisce solo byte casuali all'interno della stima del numero di bit di rumore nell'entropy pool. /dev/random può essere adatto per gli utenti che necessitano di una casualità di ottima qualità come per la creazione di one time pad o chiavi pubbliche. Quando l'entropy pool è vuota, la lettura di /dev/random si interrompe fino a quando non viene accumulato nuovo rumore ambientale. Il motivo è di fornire un generatore di numeri pseudocasuale crittograficamente sicuro, fornendo un output con un'entropia il più grande possibile.
Una controparte di /dev/random è /dev/urandom (sorgente causale non bloccata "unlocked") che riusa il pool interno per produrre bit pseudocasuali aggiuntivi. Questo significa che la richiesta non si blocca, ma il risultato potrebbe contenere meno entropia rispetto a /dev/random. Nonostante sia un generatore di numeri pseudocasuali adatto per la maggior parte delle applicazioni crittografiche, non è raccomandato per la generazione di chiavi crittografiche a lunga scadenza.
È inoltre possibile scrivere su /dev/random. Questo consente ad ogni utente di mischiare i dati casuali all'interno del pool. L'attuale ammontare dell'entropia e la dimensione dell'entropy pool del kernel Linux è disponibile attraverso /proc/sys/kernel/random/.
Nel marzo 2006 Gutterman, Pinkas, & Reinman hanno pubblicato un'analisi dettagliata del generatore di numeri casuali di Linux nel quale descrivono alcune debolezze. Probabilmente il problema più importante riportato è quello che si verifica con sistemi embedded o con i Live CD nel quale lo stato di avvio del sistema è prevedibile e l'entropia disponibile dall'ambiente potrebbe essere limitata. Per i sistemi con memoria non volatile, è raccomandato salvare qualche stato del generatore allo spegnimento in modo da poterlo usare come stato al successivo avvio. Nel caso dei router nei quali il traffico di rete rappresenta la sorgente primaria di entropia, gli autori notano che salvare lo stato tra riavvii "richiederebbe a un potenziale attaccante di spiare su tutto il traffico di rete" che passa per il router, e ottenere un accesso diretto allo stato interno del router. Questo problema è particolarmente critico nel caso di router wireless il cui traffico di rete può essere catturato a distanza, ed essere utilizzato per generare chiavi crittografiche.

## FreeBSD

Il sistema operativo FreeBSD implementa una variante a 256 bit dell'algoritmo Yarrow che ha lo scopo di fornire un generatore di numeri pseudocasuale crittograficamente sicuro che sostituisce il dispositivo random di Linux. A differenza di /dev/random di Linux, /dev/random di FreeBSD non è bloccante. Il suo comportamento è simile a /dev/urandom di Linux e /dev/urandom è collegato a /dev/random.
L'algoritmo Yarrow è basato sull'assunzione che i moderni generatori di numeri pseudocasuali sono molto sicuri se il loro stato rimane sconosciuto all'attaccante. Mentre un metodo basato su una entropy pool è completamente sicuro se implementato correttamente, non rimane sicuro se la quantità di entropia viene sovrastimata ed è più debole di un generatore basato su un seme ben inizializzato. In alcuni casi un attaccante potrebbe avere un considerevole controllo sull'entropia, per esempio i server senza disco potrebbero prendere gran parte della propria entropia dalla rete, rimanendo così vulnerabili a un attacco man-in-the-middle. Yarrow mette molta attenzione nell'evitare che un pool sia compromesso e sul suo rapido ripristino. Il seme dell'algoritmo è periodicamente rigenerato; nei sistemi con bassa attività di rete e di disco, questo viene fatto dopo una frazione di secondo.
Nel 2004 Landon Curt Noll testò /dev/random di FreeBSD 5.2.1 e concluse che non era crittograficamente sicuro perché il suo output aveva difetti multipli e uniformi. Simili difetti furono trovati nell'implementazione di /dev/random di Linux 2.4.21-20, Solaris patch 8 108528-18 e macOS 10.3.5.
FreeBSD fornisce inoltre supporto per un generatore di numeri casuali hardware.

## Altri sistemi operativi

/dev/random e /dev/urandom sono disponibili su Solaris, macOS, NetBSD, OpenBSD, UNIX 5.1B, AIX 5.2 e HP-UX 11i v2. Come in FreeBSD, AIX implementa un proprio algoritmo Yarrow. Tuttavia AIX usa una quantità di entropia considerevolmente minore dello standard e smette di riempire il pool quando pensa che contenga abbastanza entropia.
In Windows NT, una funzione simile è fornita da ksecdd.sys, ma la lettura del file speciale \Device\KsecDD non funziona come in UNIX. I metodi documentati per generare bytes crittograficamente sicuri sono CryptGenRandom e RtlGenRandom.
Anche se DOS non implementa nativamente una funzionalità simile ci sono driver da terze parti chiamati Noise.sys che creano due dispositivi, RANDOM$ and URANDOM$, che sono anche accessibili da /DEV/RANDOM$ and /DEV/URANDOM$.

## EGD come alternativa

Il software EGD (entropy gathering daemon) è un'alternativa comune per i sistemi Unix che non supportano /dev/random. È un Demone che fornisce dati casuali di qualità crittografica. Alcuni software crittografici come OpenSSL, GNU Privacy Guard, e Apache HTTP Server usano EGD quando /dev/random non è disponibile.
EGD, o la compatibile alternativa prngd, raccolgono entropia pseudo-casuale da varie sorgenti, le processano per rimuovere distorsioni e migliorare la qualità crittografica e le rendono disponibili tramite un Unix domain socket (/dev/edg-pool è una scelta comune), o attraverso un TCP socket. L'accumulo dell'entropia di solito comporta fork di sottoprocessi periodici per interrogare gli attributi del sistema che tipicamente cambiano frequentemente e sono impredicibili, come la CPU, l'I/O, l'utilizzo della rete e il contenuto di vari file di log e directory temporanee.