La generazione di numeri casuali in bash sembra semplice da fare usando il $RANDOM
variabile, ma la variabile è davvero così casuale?? Scopri cosa potrebbe impedirti di generare numeri casuali di alta qualità, e altro ancora!
Numeri casuali nel terminale
Sembra semplice generare un numero casuale in Bash:
Ma il numero è veramente casuale??
Non proprio, come possiamo vedere. Il generatore di numeri casuali in Bash dipende da un seme, un valore passato alla funzione di generazione di numeri casuali, Quello, basta che il seme sia lo stesso, genererà sempre la stessa sequenza di numeri casuali come mostra il risultato dell'esempio sopra.
Possiamo inizializzare il generatore di numeri casuali con un valore seme impostando il RANDOM
variabile al valore seme desiderato. Quindi, Forse possiamo fornire un numero casuale come seme per il generatore casuale?
Sembra funzionare un po', ogni volta che vogliamo generare un numero casuale, abbiamo pre-seminato il generatore di numeri casuali con un numero generato casualmente. Ma tutto quello che abbiamo fatto è stato prenderci in giro per un po'; abbiamo appena creato un ulteriore livello di profondità, ma il risultato è quasi lo stesso; i numeri non sono casuali e possono essere influenzati da un seme fisso precedentemente fornito.
Questo problema è chiamato problema di generazione. “entropia casuale”. Più entropia possiamo generare, migliori saranno i nostri numeri casuali. Questo particolare problema non è limitato solo a Bash, esiste in tutti i sistemi informatici di base che tentano di generare numeri casuali. Perciò, il caso non è mai veramente casuale. Alcuni altri sistemi casuali usano, come esempio, movimenti del mouse e sequenze di tasti e altri messaggi semi-casuali in combinazione per aumentare la complessità del pool di entropia casuale.
Quindi, Come possiamo generare un numero casuale “abbastanza buono” essere chiamato veramente casuale?
Per questo, come fonte e seme, avremmo bisogno di qualcosa che sia veramente, o quasi veramente, a caso. Potremmo pensare di utilizzare la data di oggi, ma non è molto casuale, secondo pensiero. E i secondi da quando? 00:00:00 UTC del 1 di gennaio di 1970 (generalmente chiamato 'epoca'’ nei circoli Linux)? Forse, ma tutto ciò che serve è un file di registro da qualche parte e l'epoca può essere ricostruita.
Una soluzione migliore è utilizzare le cifre meno significative del timer di precisione al nanosecondo:
All'inizio, anche questo non è perfetto. Potrebbe rientrare nella categoria "migliore generazione di numeri casuali"’ secondo il titolo di questo post, ma l'entropia non è perfetta per definizione. Diamo un'occhiata più da vicino a questo.
Nell'esempio, prendiamo i byte 4 un 9 oh 6 numeri del tempo dell'epoca, espresso da date +%N
e output come conseguenza del sottostrato avviato da $(...)
. Ciò significa che il nostro seme minimo è 0 e il nostro seme massimo è 999999. Questa è solo una gamma di 1 milioni di numeri.
All'inizio, questo sistema potrebbe ancora essere "hackerato": si potrebbe semplicemente passare attraverso tutti quelli 1 milioni di numeri e prendi le sequenze numeriche casuali generate da questo. Sarebbe sicuramente una pessima soluzione per generare una chiave di crittografia!, come esempio!
Se selezioniamo meno numeri, il rischio che ciò accada aumenta. Se selezioniamo di più, il rischio è ridotto, ma il "seme casuale"’ diventa anche meno casuale. Questo può essere esemplificato includendo i secondi dall'epoca:
Possiamo vedere passare i secondi! Nota le iniziali 6> 7> 8, eccetera.
Per scopi di generazione di numeri casuali standard, come esempio, nel software di test che varia il tuo approccio di test in base a un seme casuale fornito a te, è sufficiente una risposta basata su nanosecondi / abbastanza. Per altre soluzioni che potrebbero richiedere numeri casuali di migliore qualità, potrebbe essere necessaria una soluzione basata su hardware esterno.
La vera generazione di numeri casuali non è una cosa semplice. Esistono soluzioni basate su hardware che possono avvicinarsi o raggiungere una vera entropia casuale e / o generazione di numeri casuali. Soprattutto i dispositivi che non si concentrano solo sull'hardware possono essere la chiave per generare quel numero casuale perfetto..