Quando si generano dei numeri “a caso” con un normale sistema informatico quale può essere un PC, si fa normalmente ricorso agli algoritmi PRNG (pseudo-random numbers).
Si chiamano, in italiano, generatori di numeri pseudo-casuali perché generare via software un numero davvero casuale è molto complicato.
Nelle applicazioni che devono offrire un certo livello di sicurezza, quindi, i requisiti sono generalmente più stringenti. Nel caso dei software crittografici, ad esempio, è essenziale che l’algoritmo non consenta di risalire all’intera sequenza di numeri generati dal calcolatore avendone osservata solo una parte. In tal caso un aggressore potrebbe risalire alla chiave crittografica partendo dalla sequenza, avendo così la possibilità di decifrare i dati altrui.
Il punto è che su web molti sviluppatori ricorrono alla funzione JavaScript Math.random()
che viene considerata inaffidabile per generare numeri sufficientemente casuali. L’utilizzo di tale funzione ha evidentemente implicazioni importanti perché viene ampiamente adoperata per la gestione delle transazioni sui siti di e-commerce.
Il problema era stato, tra l’altro, recentemente posto in evidenza anche da una società impegnata nelle scommesse online che confermava come la funzione in questione portasse alla generazione di sequenze di numeri molto simili tra loro.
Per la generazione di numeri pseudo-casuali usando la funzione JavaScript Math.random()
, il motore di Google V8 (usato in Chrome) utilizzava l’algoritmo chiamato MWC1616. Proprio quest’ultimo era responsabile della generazione di numeri “poco casuali”.
Adesso Google, così come Mozilla ed Apple, hanno deciso di impiegare – nei rispettivi browser (quindi Chrome, Firefox e Safari) – un nuovo algoritmo chiamato xorshift128+.
L’obiettivo è evidentemente quello di introdurre una maggiore casualità nella generazione dei numeri via JavaScript.
La notizia è che l’algoritmo xorshift128+ è stato messo a punto da un italiano, Sebastiano Vigna, docente presso l’Università degli Studi di Milano.
La casualità ottenibile utilizzando processi fisici (si pensi al lancio di un dado) è molto difficile da riprodurre via software o comunque sarebbe davvero troppo costosa. Sarebbe estremamente dispendioso generare, infatti, milioni di bit al secondo per un’applicazione web.
L’algoritmo di Vigna, che Google, Mozilla ed Apple, hanno confermato d’ora in avanti di adottare, consente di generare numeri “molto più casuali” rispetto all’approccio sin qui adottato dai browser capaci di supportare JavaScript.
L’algoritmo xorshift128+, come suggerisce il nome, è caratterizzato da un periodo di 2128-1. Con il termine periodo ci si riferisce al numero di elementi dopo i quali la sequenza generata si ripete. Ovviamente, più è lungo il periodo e migliore è la qualità del generatore.
Inoltre, mentre l’algoritmo sino ad oggi usato nei browser tendeva a generare numeri facilmente prevedibili scegliendo in maniera scorretta il seme, ossia il parametro usato per inizializzare il generatore di numeri pseudo-casuali, xorshift128+ non soffre di questa limitazione. Anzi, l’algoritmo italiano ha brillantemente superato tutti i test di analisi statistica (i.e. TestU01).
Come spiegato da un ingegnere di Google, comunque, anche xorshift128+ non è adeguato per le esigenze crittografiche. Per la cifratura dei dati, infatti, i tradizionali generatori di numeri pseudo-casuali non sono adeguati. A fronte di tali esigenze viene consigliato l’utilizzo delle API Web Cryptography che integrano il metodo window.crypto.getRandomValues
, in grado di restituire numeri sicuri per l’utilizzo in ambito crittografico ad un costo contenuto in termini di performance.
Lo studio di Vigna è consultabile a questo indirizzo.