Generatore di numeri casuali: istantaneo, gratuito e veramente casuale
Che cos'è un generatore di numeri casuali?
Un generatore di numeri casuali (RNG) è un sistema – computazionale, fisico o ibrido – che produce una sequenza di numeri che non può essere prevista con maggiore precisione rispetto al caso. Ogni valore di output è statisticamente indipendente dai valori precedenti e l'intera sequenza non mostra alcun modello riconoscibile che un osservatore potrebbe sfruttare per indovinare i risultati futuri. Questa definizione sembra semplice, ma realizzarla nella pratica è uno dei problemi più complessi della matematica applicata e dell'informatica.
L'espressione "generatore di numeri casuali" si riferisce a due concetti fondamentalmente diversi che vengono spesso confusi: i generatori di numeri pseudo-casuali (PRNG) , che utilizzano algoritmi deterministici per produrre sequenze che appaiono casuali, e i generatori di numeri veramente casuali (TRNG) , che sfruttano l'entropia fisica reale dell'universo. Una terza categoria, i generatori di numeri pseudo-casuali crittograficamente sicuri (CSPRNG) , si colloca tra i due: pur essendo deterministici nell'implementazione, sono progettati in modo tale che nessun attacco computazionalmente fattibile possa distinguere il loro output da una vera casualità.
Perché i generatori di numeri casuali sono importanti
I generatori di numeri casuali (RNG) sono un'infrastruttura fondamentale in ambito scientifico, di sicurezza e nei software di uso quotidiano. Senza una casualità affidabile, la crittografia moderna collasserebbe: ogni sessione TLS, ogni messaggio crittografato, ogni firma digitale dipende da chiavi segrete che devono essere imprevedibili. Casinò, lotterie e giochi online si basano sugli RNG per garantire l'equità. Le simulazioni scientifiche, dalla modellazione climatica alla scoperta di farmaci, utilizzano il campionamento casuale per approssimare soluzioni analiticamente intrattabili. Il campionamento statistico, i test A/B, la generazione procedurale di mondi di gioco e persino l'inizializzazione dei pesi delle reti neurali richiedono tutti numeri casuali di alta qualità.
Le conseguenze di una cattiva gestione della casualità sono gravi e ben documentate. Nel 2012, i ricercatori hanno scoperto che milioni di chiavi pubbliche RSA su Internet condividevano fattori primi perché i dispositivi che le generavano avevano un'entropia insufficiente all'avvio. Un attaccante che fattorizza un numero primo condiviso può recuperare la chiave privata e decifrare tutte le comunicazioni. Nel 2010, la PlayStation 3 di Sony è stata violata perché la sua implementazione ECDSA riutilizzava lo stesso nonce "casuale" per ogni firma: un singolo valore ripetuto è sufficiente per estrarre algebricamente la chiave privata. Questi non sono casi limite; sono il risultato prevedibile del considerare la casualità come un problema risolto.
Principali ambiti di applicazione
- Crittografia e sicurezza: generazione di chiavi, vettori di inizializzazione, nonce, salt, token di sessione e numeri di serie dei certificati.
- Simulazioni e modellizzazione: metodi Monte Carlo, equazioni differenziali stocastiche, simulazioni di fisica delle particelle, modelli epidemiologici.
- Giochi e scommesse: mescolamento di carte, lancio di dadi, risultati delle slot machine, generazione procedurale di livelli, tabelle del bottino.
- Statistica e ricerca: campionamento casuale, studi clinici randomizzati controllati, bootstrapping, suddivisioni per convalida incrociata.
- Sistemi distribuiti: elezione del leader, bilanciamento del carico con jitter, backoff esponenziale con ritardi casuali.
- Apprendimento automatico: inizializzazione dei pesi, maschere di dropout, aumento dei dati, discesa del gradiente stocastico.
Come funziona un generatore di numeri pseudo-casuali
Un generatore di numeri pseudo-casuali (PRNG) parte da un seme , ovvero un singolo numero o un piccolo blocco di dati, e applica ripetutamente una funzione matematica deterministica per produrre una lunga sequenza di output. Dato lo stesso seme, la sequenza è perfettamente riproducibile. Con un seme diverso, la sequenza risulterà completamente diversa. La qualità di un PRNG viene valutata in base alla sua capacità di superare test statistici di casualità e, per le applicazioni di sicurezza, in base alla possibilità di dedurre il suo stato interno dagli output.
Generatori congruenziali lineari
La famiglia di generatori di numeri pseudo-casuali (PRNG) più antica e semplice utilizza la relazione di ricorrenza X n+1 = (aX n + c) mod m , dove a, c e m sono costanti scelte con cura. La funzione rand() della libreria standard C, in molte implementazioni, è un generatore congruenziale lineare (LCG). Gli LCG sono veloci e facili da implementare, ma presentano gravi debolezze: i bit di ordine inferiore si ripetono con brevi periodi, il periodo della sequenza completa è al massimo m e lo stato interno è facilmente recuperabile da poche uscite. Sono accettabili per semplici simulazioni e giochi senza requisiti di sicurezza, ma completamente inaccettabili per qualsiasi applicazione crittografica.
Torsione di Mersenne
Il Mersenne Twister (MT19937), pubblicato da Matsumoto e Nishimura nel 1998, è diventato il generatore di numeri pseudo-casuali predefinito in Python, Ruby, R, PHP e molti altri linguaggi. Ha un periodo di 2¹⁹⁹³⁷⁻¹ (enormemente grande), supera praticamente tutti i test statistici ed è molto veloce. Il suo stato interno è costituito da 624 interi a 32 bit. Il punto debole critico: se un attaccante osserva 624 output consecutivi, può ricostruire l'intero stato interno e prevedere ogni output futuro. Il Mersenne Twister è quindi totalmente inadatto a qualsiasi applicazione sensibile alla sicurezza, nonostante sia ampiamente utilizzato impropriamente in tale ruolo.
Generatori di numeri pseudo-casuali moderni: Xoshiro, PCG e SFC
Attualmente, tra i generatori di numeri pseudo-casuali non crittografici più diffusi si annoverano la famiglia PCG (Permuted Congruential Generators), xoshiro256** e SFC64 . Questi generatori sono più piccoli, più veloci e statisticamente superiori a Mersenne Twister. In particolare, PCG offre prestazioni eccellenti nella suite di test TestU01 BigCrush, la più impegnativa suite di test statistici standard per i generatori di numeri pseudo-casuali. NumPy ha sostituito il generatore predefinito Mersenne Twister con PCG64 nella versione 1.17 proprio per questo motivo.
Come funziona un generatore di numeri pseudo-casuali crittograficamente sicuro
Un CSPRNG deve soddisfare due proprietà che vanno oltre la normale casualità statistica. In primo luogo, l'imprevedibilità del bit successivo : dati tutti gli output precedenti, nessun algoritmo in tempo polinomiale può prevedere il bit successivo con una probabilità significativamente maggiore del 50%. In secondo luogo, la resistenza alla compromissione dello stato : se un attaccante viene a conoscenza dello stato interno corrente, non può ricostruire gli output passati (questa proprietà è chiamata segretezza retroattiva o resistenza al backtracking).
I moderni sistemi operativi forniscono i CSPRNG come servizio di base. Linux espone /dev/urandom e la chiamata di sistema getrandom() , entrambe basate su un pool di entropia del kernel inizializzato da eventi hardware. Windows fornisce BCryptGenRandom() . macOS e iOS utilizzano arc4random_buf() , che a partire da macOS 10.12 è supportato da ChaCha20. Le strutture sottostanti utilizzate nei CSPRNG di produzione includono Hash_DRBG , HMAC_DRBG e CTR_DRBG (tutte standardizzate nello standard NIST SP 800-90A), nonché i generatori basati su ChaCha20 utilizzati dai sistemi BSD e dalle moderne distribuzioni Linux.
Come funziona un generatore di numeri veramente casuali
Un TRNG estrae la casualità da processi fisici che sono genuinamente imprevedibili, sia perché sono fondamentalmente di natura quantistica, sia perché coinvolgono sistemi classici caotici sensibili a condizioni iniziali non misurabili.
Fonti comuni di entropia fisica
- Rumore termico (rumore di Johnson-Nyquist): il movimento casuale degli elettroni in un resistore produce fluttuazioni di tensione che possono essere campionate e digitalizzate.
- Rumore di shot: l'arrivo discreto e casuale di fotoni o elettroni su un rivelatore produce un segnale casuale misurabile.
- Decadimento radioattivo: la tempistica degli eventi di decadimento di una sorgente radioattiva è genuinamente casuale dal punto di vista quantistico. RANDOM.ORG utilizza il rumore radio atmosferico, che è altrettanto imprevedibile.
- Sorgenti ottiche quantistiche: i tempi di arrivo dei fotoni, le fluttuazioni del vuoto misurate tramite rilevamento omodino e le scelte del percorso del divisore di fascio sono tutte fonti di casualità quantistica certificata.
- Entropia hardware sui dispositivi di consumo: le CPU moderne includono istruzioni dedicate per la generazione di numeri casuali (RNG). La funzione RDRAND di Intel utilizza una sorgente di rumore termico on-chip condizionata tramite AES-CBC-MAC. La funzione equivalente di AMD funziona in modo simile. La funzione TrustZone di ARM include una sorgente di entropia hardware accessibile al sistema operativo.
- Pool di entropia del sistema operativo: Linux raccoglie entropia dai tempi di interruzione, dalla latenza di I/O del disco, dai tempi di arrivo dei pacchetti di rete e dalle istruzioni del generatore di numeri casuali hardware, combinandoli attraverso una costruzione crittografica per produrre il pool di entropia del kernel.
Il problema del condizionamento
Il rumore fisico grezzo raramente è distribuito uniformemente. Una sorgente di rumore termico potrebbe produrre un numero leggermente maggiore di 0 rispetto agli 1 a causa delle asimmetrie del circuito. Un TRNG (generatore di numeri casuali veri e propri) include quindi una fase di condizionamento , tipicamente una funzione hash crittografica o una funzione di estrazione, che comprime i campioni grezzi in un output più breve e dimostrabilmente uniforme. Il rapporto tra i bit grezzi consumati e i bit di output prodotti è chiamato tasso di entropia minima , e un TRNG ben progettato caratterizza attentamente questo tasso. La norma NIST SP 800-90B definisce i requisiti di test e validazione per le sorgenti di entropia utilizzate nei sistemi federali.
Confronto tra PRNG, CSPRNG e TRNG
| Proprietà | PRNG | CSPRNG | TRNG |
|---|---|---|---|
| Deterministico | SÌ | Sì (dopo la semina) | NO |
| Riproducibile dal seme | SÌ | SÌ | NO |
| Supera i test statistici | Generalmente | SÌ | Sì (dopo il condizionamento) |
| Sicuro contro le previsioni | NO | SÌ | SÌ |
| Velocità | Molto veloce | Veloce | Lento (limitato dall'hardware) |
| Richiede entropia hardware | Solo per la semina | Solo per la semina | Sempre |
| Casi d'uso tipici | Simulazioni, giochi, campionamento | Generazione di chiavi, token, crittografia | chiavi ad alta sicurezza, regolamentazione del gioco d'azzardo, ricerca |
La definizione statistica di casualità
La casualità non è una proprietà binaria: esiste su uno spettro e lo standard appropriato dipende interamente dall'applicazione. Una sequenza è considerata casuale per un dato scopo se nessun test pertinente a tale scopo è in grado di distinguerla da una sequenza casuale teoricamente ideale. Il NIST pubblica una suite di test statistici (SP 800-22) che comprende quindici test, tra cui analisi di frequenza, test di sequenza, analisi spettrale e complessità lineare. La batteria BigCrush della libreria TestU01, sviluppata presso l'Université de Montréal, è ancora più esigente, applicando 106 test distinti. Un generatore che non supera il test BigCrush non è adatto per lavori di simulazione seri, indipendentemente dalla sua velocità di esecuzione.
È importante chiarire cosa non si intende per casualità. Una sequenza come 1, 2, 3, 4, 5 non è casuale, anche se ogni singolo numero ha la stessa probabilità di ogni altro: lo schema è prevedibile. Al contrario, una sequenza può apparire localmente strutturata per caso (tre teste di fila lanciando una moneta non truccata) senza essere non casuale. La casualità è una proprietà del processo di generazione, non di una particolare sequenza di output considerata isolatamente.
Come funzionano i generatori di numeri casuali: meccanismi principali e strategie pratiche
I generatori di numeri casuali si dividono in due categorie fondamentali: i generatori di numeri pseudocasuali (PRNG), che utilizzano algoritmi deterministici con un valore iniziale predefinito, e i generatori di numeri veramente casuali (TRNG), che derivano l'entropia da fenomeni fisici. La scelta del tipo più adatto, la corretta impostazione del valore iniziale e la sua applicazione al caso d'uso specifico determinano se i risultati saranno statisticamente validi, crittograficamente sicuri o pericolosamente prevedibili.
Strategia passo passo per la scelta e l'utilizzo di un generatore di numeri casuali (RNG).
Prima di generare un singolo numero, è necessario scegliere il generatore più adatto al compito. Utilizzare un PRNG veloce per la generazione di chiavi crittografiche è uno degli errori più gravi in materia di sicurezza del software. Allo stesso modo, utilizzare un RNG hardware lento per una simulazione Monte Carlo con miliardi di iterazioni comporta uno spreco inutile di risorse. I seguenti passaggi illustrano il processo decisionale partendo dai principi fondamentali.
Passaggio 1: Definisci i requisiti di casualità
Prima di utilizzare qualsiasi strumento o libreria, poniti tre domande:
- La prevedibilità è importante? Se un avversario che indovina i tuoi numeri causa danni — in crittografia, gioco d'azzardo, lotterie o token di sicurezza — hai bisogno di una casualità di livello crittografico. Se stai eseguendo una simulazione fisica o randomizzando una playlist, un generatore di numeri pseudo-casuali (PRNG) di alta qualità è sufficiente.
- Di quanti numeri hai bisogno? Alcuni generatori hanno periodi finiti. Il Mersenne Twister, ampiamente utilizzato nel modulo
randomdi Python e in molti altri linguaggi, ha un periodo di 2¹⁹⁹³⁷⁻¹ , che è astronomicamente grande per la maggior parte degli scopi, ma rimane comunque finito e deterministico. - Hai bisogno di riproducibilità? Gli esperimenti scientifici e la generazione procedurale di giochi spesso richiedono che venga rigenerata esattamente la stessa sequenza. Un PRNG con seed predefinito ti offre questa possibilità. Un TRNG no.
Passaggio 2: Selezionare il tipo di generatore corretto
| Caso d'uso | Generatore consigliato | Esempi |
|---|---|---|
| Chiavi crittografiche, password, token | CSPRNG (Generatore di numeri pseudo-casuali crittograficamente sicuro) | modulo secrets (Python), crypto.randomBytes (Node.js), /dev/urandom (Linux) |
| Simulazioni, statistica, apprendimento automatico | Generatore di numeri pseudo-casuali di alta qualità | Mersenne Twister, PCG64, xoshiro256** |
| Lotterie, estrazioni verificabili | TRNG o generatore di numeri casuali hardware certificato | RANDOM.ORG, moduli di sicurezza hardware (HSM) |
| Giochi, generazione procedurale | Generatore di neutroni autoctono | Mersenne Twister, LCG con buone costanti |
| sistemi embedded in tempo reale | Generatore di numeri casuali hardware su chip | Intel RDRAND, ARM TrueRNG |
Passaggio 3: Inizializzare correttamente il generatore
Il seme rappresenta il punto critico di vulnerabilità per la maggior parte dei generatori di numeri pseudo-casuali (PRNG). Un seme debole o prevedibile compromette l'intero modello di sicurezza del PRNG, indipendentemente dalla sofisticatezza del suo algoritmo.
- Utilizza seed ad alta entropia. I pool di entropia del sistema operativo (
/dev/urandomsu Unix,CryptGenRandomsu Windows ) combinano eventi hardware, come i tempi di digitazione della tastiera, gli interrupt del disco e l'arrivo di pacchetti di rete, per generare seed praticamente impossibili da prevedere. - Non utilizzare mai solo l'orologio di sistema come seed. Un utente malintenzionato che conosce l'ora approssimativa di avvio del programma può forzare un seed basato su timestamp in pochi secondi. Questa vulnerabilità è stata sfruttata in attacchi reali a siti di poker online e sistemi di lotteria.
- Non inserire mai seed fissi nel codice di produzione. Un seed fisso produce la stessa sequenza a ogni esecuzione. Questo è utile per i test, ma catastrofico per la sicurezza.
- Nelle applicazioni a lunga esecuzione, è consigliabile reinserire periodicamente nuova entropia. Se l'applicazione viene eseguita per giorni o settimane, l'iniezione periodica di nuova entropia impedisce al generatore di entrare in uno stato prevedibile.
Passaggio 4: Applica il generatore al tuo compito specifico
Generare un numero casuale grezzo raramente rappresenta l'obiettivo finale. L'applicazione pratica – campionamento, rimescolamento, mappatura degli intervalli – introduce a sua volta delle modalità di errore.
Generazione di numeri in un intervallo
L'approccio ingenuo di utilizzare l'operatore modulo ( rand() % N ) introduce una distorsione del modulo. Se l'intervallo di output del generatore non è divisibile per N, alcuni valori appariranno più frequentemente di altri. Ad esempio, se il generatore produce valori da 0 a 32767 e si desiderano numeri da 0 a 99, i valori da 0 a 67 appariranno leggermente più spesso di quelli da 68 a 99 perché 32768 non è divisibile per 100.
- Utilizza il campionamento per rifiuto. Scarta i valori che ricadono nella coda distorta e ricampiona. La maggior parte delle librerie standard ben implementate lo fa automaticamente.
- Utilizza le funzioni di intervallo integrate. Le funzioni `
random.randint(a, b)di Python,ThreadLocalRandom.nextInt(origin, bound)di Java e simili gestiscono internamente la distorsione. - Per scopi crittografici, utilizzare il modulo
secretsin Python o equivalente, che implementa per impostazione predefinita la selezione imparziale dell'intervallo.
Mescolare un elenco in modo equo
L'algoritmo di Fisher-Yates (chiamato anche algoritmo di Knuth) è l'unico algoritmo corretto per generare una permutazione uniformemente casuale. Funziona iterando dall'ultimo elemento al primo, scambiando ciascun elemento con un elemento scelto casualmente che si trova nella stessa posizione o prima di essa.
- Inizia dall'ultimo indice i = n−1.
- Scegli un indice casuale j tale che 0 ≤ j ≤ i.
- Scambia gli elementi nelle posizioni i e j .
- Decrementa i e ripeti finché i = 0.
L'alternativa ingenua, ovvero scegliere una posizione casuale per ogni elemento in modo indipendente, non produce una distribuzione uniforme. Alcune permutazioni si presentano più spesso di altre, il che rappresenta un difetto misurabile e sfruttabile nei giochi di carte e nelle lotterie.
Campionamento senza reimmissione
Quando si necessitano k valori unici da una popolazione di n elementi, estrarre e scartare i duplicati è inefficiente. Per set di dati di grandi dimensioni o in streaming, è preferibile utilizzare il campionamento a serbatoio, oppure l'algoritmo di Fisher-Yates su una copia della popolazione per set di dati più piccoli. random.sample(population, k) di Python implementa correttamente ed efficientemente questa tecnica.
Passaggio 5: Verifica la qualità dell'energia erogata dal tuo generatore.
Anche un generatore di numeri casuali (RNG) implementato correttamente può fallire in applicazioni specifiche se le sue proprietà statistiche non corrispondono a quelle richieste dall'applicazione stessa. Le suite di test standard individuano la maggior parte dei difetti.
- TestU01 (BigCrush): La batteria di test statistici più rigorosa per i generatori di numeri pseudo-casuali (PRNG). Applica centinaia di test ed è in grado di rilevare correlazioni sottili che i test più semplici non riescono a individuare. Molti generatori più vecchi, incluse alcune varianti di LCG, non superano BigCrush.
- Diehard / Dieharder: una suite di test statistici ampiamente utilizzata, originariamente sviluppata da George Marsaglia. Dieharder è la versione aggiornata ed estesa.
- NIST SP 800-22: La suite di test standard per i generatori di numeri casuali crittografici, richiesta per la certificazione FIPS. Verifica la frequenza, le sequenze, le proprietà spettrali e altro ancora.
- PractRand: Particolarmente efficace nel rilevare guasti nei generatori con periodi brevi o scarsa diffusione.
Let AutoSEO write & rank this for you — on autopilot
Enter your site: we scan it, build a keyword plan, and publish ranking-ready articles for Google and AI answers. Start for $1.
Errori comuni da evitare
La maggior parte dei malfunzionamenti dei generatori di numeri casuali (RNG) nei sistemi di produzione deriva da un piccolo insieme di errori ricorrenti. Riconoscerli in anticipo previene la maggior parte delle vulnerabilità e degli artefatti statistici reali.
Errore 1: Utilizzo di Math.random() o equivalente per la sicurezza
Le funzioni ` Math.random() di JavaScript, il modulo random di Python (non secrets ), rand() di PHP e funzioni simili di uso generale sono esplicitamente documentate come inadatte all'uso crittografico. Privilegiano la velocità rispetto all'imprevedibilità. Un attaccante che osserva un numero sufficiente di valori di output può ricostruire lo stato interno di un algoritmo Mersenne Twister con appena 624 output consecutivi a 32 bit, per poi prevedere tutti i valori futuri. Questo tipo di attacco è stato dimostrato su piattaforme di gioco d'azzardo online.
Errore 2: Riutilizzare lo stesso seme in più sessioni
Se un'applicazione web inizializza il generatore di token di sessione con l'ID del processo del server o il timestamp di avvio, ogni token di sessione generato nello stesso secondo condividerà lo stesso seed. Non si tratta di una teoria, ma della causa principale delle vulnerabilità di dirottamento di sessione nei framework di produzione.
Errore 3: Generare un numero di bit insufficiente rispetto all'entropia richiesta
Un PIN a 6 cifre ha circa 20 bit di entropia. Un UUID v4 ne ha 122. Una chiave crittografica necessita di almeno 128 bit per la crittografia simmetrica e 256 bit per la sicurezza a lungo termine contro hardware futuri. Generare token brevi e presumere che siano impossibili da indovinare è un difetto strutturale, non un dettaglio di implementazione.
Errore 4: Ignorare il comportamento specifico della piattaforma
- Su alcuni kernel Linux più vecchi, la lettura da
/dev/randomsi blocca quando il pool di entropia è esaurito./dev/urandomnon si blocca ed è sicuro per la maggior parte degli scopi crittografici dopo l'avvio iniziale. - Le macchine virtuali possono avere un'entropia ridotta all'avvio perché non dispongono della diversità di eventi hardware delle macchine fisiche. L'inserimento di dati immediatamente dopo l'istanza della macchina virtuale può produrre chiavi deboli.
- Alcuni sistemi embedded non dispongono affatto di un generatore di numeri casuali hardware. Gli sviluppatori a volte ricorrono a fonti di entropia esclusivamente software, che sono molto più deboli di quanto sembri.
Errore 5: Trattare l'output mescolato come uniformemente casuale senza verifica
Se il generatore di numeri casuali (RNG) sottostante ha un periodo inferiore al numero di permutazioni possibili del vostro dataset, non tutte le permutazioni possono essere generate. Un mazzo standard di 52 carte ha 52! ≈ 2²²⁶ possibili ordinamenti. Un generatore con un seed a 32 bit può produrre al massimo 2³² ≈ 4 miliardi di sequenze distinte, una frazione infinitesimale di tutte le possibili mescolate. Per i giochi di carte con puntate reali, questa è una debolezza concreta e sfruttabile.
Errore n. 6: confondere l'indipendenza con l'uniformità
Una sequenza può essere distribuita uniformemente, con ogni valore che appare con uguale frequenza, pur mantenendo un'elevata correlazione tra estrazioni consecutive. Molti LCG di bassa qualità superano i test di frequenza ma falliscono i test spettrali perché i loro valori successivi ricadono su un numero limitato di iperpiani nello spazio multidimensionale. Questo artefatto, noto come struttura reticolare degli LCG, li rende inadatti all'integrazione Monte Carlo multidimensionale.
Tattiche pratiche per linguaggio di programmazione
Pitone
- Utilizzare
secrets.token_bytes(n),secrets.token_hex(n)osecrets.randbelow(n)per qualsiasi valore sensibile alla sicurezza. - Utilizza
random.SystemRandom()come sostituto diretto dirandom.Random()quando hai bisogno dell'interfaccia standard supportata dall'entropia del sistema operativo. - Per i calcoli numerici, utilizzare
numpy.random.default_rng()che, per impostazione predefinita, utilizza il generatore PCG64, un generatore di numeri pseudo-casuali moderno e di alta qualità che supera il test BigCrush.
JavaScript / Node.js
- Per tutti gli scopi di sicurezza, utilizzare
crypto.randomBytes(n)ocrypto.getRandomValues()(API Web Crypto nei browser). - Non utilizzare mai
Math.random()per token, ID o qualsiasi altra cosa che un avversario potrebbe tentare di prevedere.
Giava
- Per scopi crittografici, utilizzare
java.security.SecureRandom. È consigliabile crearne un'istanza una sola volta e riutilizzarla, poiché la creazione è un'operazione dispendiosa. - Utilizzare
ThreadLocalRandomper applicazioni non di sicurezza ad alto throughput in ambienti multithread. - Evitate di utilizzare
java.util.Randomin contesti concorrenti: usa un seed condiviso che può generare collisioni in caso di contesa.
C / C++
- Evitate
rand()della libreria standard C. È definita dall'implementazione, spesso è un LCG debole e non è thread-safe. - Utilizzare
std::mt19937da<random>inizializzato constd::random_deviceper uso generico. - Per scopi crittografici, richiamare direttamente le primitive del sistema operativo:
getrandom()su Linux,BCryptGenRandomsu Windows.
Strumenti, software e automazione per la generazione di numeri casuali
Gli strumenti più diffusi per la generazione di numeri casuali spaziano dai servizi basati su browser come RANDOM.ORG (che ricava l'entropia dal rumore atmosferico) alle librerie crittografiche integrate in tutti i principali linguaggi di programmazione. La scelta dello strumento più adatto dipende dal caso d'uso: le simulazioni statistiche richiedono velocità e qualità statistica, le applicazioni di sicurezza necessitano di imprevedibilità crittografica e gli esperimenti fisici richiedono una vera casualità hardware.
Strumenti RNG basati su browser e online
Gli strumenti RNG online non richiedono installazione e sono adatti per estrazioni occasionali, dimostrazioni in classe e decisioni rapide. Tra le opzioni più affidabili si annoverano:
- RANDOM.ORG — Utilizza il rumore radio atmosferico come vera e propria fonte di entropia. Offre generatori di numeri interi, mescolatori di sequenze, generatori gaussiani e un'API basata su quote per l'accesso programmatico.
- Il generatore di numeri casuali integrato di Google : la ricerca di "numero casuale tra 1 e 100" su Google restituisce un risultato immediato utilizzando un generatore di numeri pseudo-casuali (PRNG) inizializzato con l'entropia del sistema.
- Strumenti per la selezione di numeri tramite ruota : interfacce visive con ruota girevole che utilizzano JavaScript Math.random(), adatte per selezioni in stile scolastico o in programmi televisivi a quiz.
- Sondaggio casuale e Ruota dei nomi : combina l'inserimento di liste con la selezione casuale per l'assegnazione dei ruoli in squadra, le estrazioni a premi e le decisioni di gruppo.
Un limite significativo della maggior parte degli strumenti per browser è che si basano sulla funzione ` Math.random() ` di JavaScript, che è un generatore di numeri pseudo-casuali (PRNG) e non è crittograficamente sicuro. Per qualsiasi operazione che coinvolga sicurezza, token o decisioni finanziarie, è consigliabile utilizzare uno strumento o una libreria crittografica dedicata.
Librerie di linguaggi di programmazione e funzioni integrate
Ogni linguaggio di programmazione principale include almeno un modulo RNG (generatore di numeri casuali). La tabella seguente riassume le opzioni più comunemente utilizzate e la loro classificazione di sicurezza:
| Lingua | Generatore di numeri pseudo-casuali standard | Generatore di numeri casuali crittografico | Note |
|---|---|---|---|
| Pitone | casuale (Mersenne Twister) | segreti, os.urandom() | Utilizzare segreti per token, password e chiavi |
| JavaScript | Math.random() | crypto.getRandomValues() | L'API Web Crypto è disponibile in tutti i browser moderni. |
| Giava | java.util.Random | java.security.SecureRandom | SecureRandom si blocca finché non è disponibile un'entropia sufficiente. |
| C / C++ | rand() (da evitare in produzione) | /dev/urandom, istruzione RDRAND | La funzione rand() è debole; per qualsiasi cosa seria, usa l'entropia a livello di sistema operativo. |
| Andare | matematica/rand | criptovaluta/rand | crypto/rand legge direttamente dal CSPRNG del sistema operativo |
| Rubino | Casuale (basato su MT) | SecureRandom | SecureRandom incapsula OpenSSL o /dev/urandom |
| PHP | rand(), mt_rand() | byte_casuali(), interi_casuali() | random_int() è supportato da CSPRNG a partire da PHP 7 |
Dispositivi RNG hardware
Per le applicazioni che richiedono un'entropia di altissima qualità, come la generazione di chiavi per autorità di certificazione, i moduli di sicurezza hardware (HSM) o la strumentazione scientifica, sono disponibili generatori di numeri casuali hardware (HRNG) dedicati:
- Intel RDRAND / RDSEED — Istruzioni a livello di CPU che campionano il rumore termico dai circuiti integrati, disponibili sulla maggior parte dei processori x86 moderni a partire da Ivy Bridge (2012).
- Generatori di numeri casuali ad alta risoluzione (HRNG) USB dedicati : dispositivi come OneRNG o TrueRNG si collegano a una porta USB e immettono entropia nel pool del sistema operativo tramite /dev/random o /dev/urandom su Linux.
- HSM (Hardware Security Modules) — Dispositivi di livello enterprise di fornitori come Thales, Entrust e AWS CloudHSM che generano e memorizzano chiavi crittografiche utilizzando sorgenti di entropia hardware certificate.
- I servizi Quantum RNG — API cloud di ID Quantique e ANU (Australian National University) forniscono bit casuali derivati dalle fluttuazioni del vuoto quantistico, offrendo un output dimostrabilmente non deterministico.
Integrazione tra automazione e flussi di lavoro
L'automazione della generazione di numeri casuali all'interno di flussi di lavoro più ampi, come pipeline di test A/B, simulazioni Monte Carlo, lotterie programmate o campionamenti di audit casuali, in genere prevede uno dei tre approcci seguenti:
- Integrazione API : RANDOM.ORG offre un'API JSON-RPC che restituisce numeri interi, sequenze, stringhe e UUID veramente casuali. Le richieste autenticate consentono quote più elevate e casualità firmata con certificati di autenticità verificabili.
- Inizializzazione della pipeline CI/CD : strumenti di test statistici come TestU01 o Dieharder possono essere eseguiti automaticamente nelle pipeline di integrazione continua per verificare che qualsiasi implementazione personalizzata di un generatore di numeri casuali mantenga la qualità statistica al variare del codice.
- Pianificazione nativa della piattaforma : le piattaforme cloud (AWS Lambda, Google Cloud Functions, Azure Functions) possono attivare processi basati su RNG (generatori di numeri casuali) in base a una pianificazione, ad esempio per campionare casualmente le voci di registro per i controlli di sicurezza o per assegnare coorti casuali giornaliere negli esperimenti comportamentali.
Strumenti come AutoSEO dimostrano come l'automazione possa estendersi anche ai flussi di lavoro relativi a contenuti e dati che si basano sul campionamento casuale. AutoSEO automatizza il processo di identificazione, verifica e prioritizzazione delle attività SEO utilizzando tecniche di campionamento casuale per selezionare sottoinsiemi di pagine rappresentative da grandi set di dati di scansione, garantendo che i controlli di qualità siano imparziali e che non emergano punti ciechi sistematici derivanti dalla verifica costante delle stesse pagine ad alto traffico. Questo rispecchia la stessa logica utilizzata negli studi clinici randomizzati controllati: introducendo una casualità strutturata nel processo di selezione, AutoSEO produce valutazioni dello stato di salute del sito statisticamente più valide rispetto agli auditor deterministici basati su regole.
Come misurare la qualità e il successo di un generatore di numeri casuali
Un buon generatore di numeri casuali supera i test statistici di uniformità, indipendenza e imprevedibilità. I principali parametri di riferimento sono le suite di test empirici, l'analisi del periodo teorico e, per i generatori di numeri casuali crittografici, la resistenza agli attacchi di ricostruzione dello stato.
Suite di test statistici
Non è possibile dimostrare che una sequenza finita sia veramente casuale, ma è possibile testare le sequenze per rilevare eventuali non casualità. Le suite di test più autorevoli sono:
- NIST SP 800-22 — Una suite di 15 test statistici pubblicati dal National Institute of Standards and Technology, utilizzati per valutare i generatori di numeri casuali (RNG) sottoposti a certificazione crittografica. I test includono test di frequenza, di sequenza, spettrali (DFT) e seriali.
- TestU01 (BigCrush) — Sviluppato presso l'Università di Montreal, BigCrush è la batteria di test statistici più impegnativa disponibile pubblicamente. Algoritmi come LCG e i vecchi generatori Wichmann-Hill non lo superano; Xoshiro256** e PCG lo superano.
- Dieharder — Un'estensione open-source della batteria Diehard originale di George Marsaglia, che esegue oltre 100 test su ampi campioni di output del generatore.
- PractRand : una suite di test moderna scalabile a campioni di grandi dimensioni (terabyte di output), in grado di rilevare distorsioni sottili invisibili ai test con campioni più piccoli.
Indicatori chiave di qualità
- Lunghezza del periodo : il numero di valori generati prima che la sequenza si ripeta. Il Mersenne Twister ha un periodo di 2¹⁹⁹³⁷⁻¹ , che è sufficiente per praticamente tutte le applicazioni non crittografiche.
- Equidistribuzione : indica se i valori sono distribuiti uniformemente nell'intervallo di output in una dimensione, in due dimensioni e in proiezioni multidimensionali.
- Sensibilità del seme : se piccole modifiche al seme producono sequenze di output completamente diverse (importante per la riproducibilità della simulazione).
- Throughput : velocità di output in MB/s, ovvero miliardi di numeri al secondo, rilevante per i carichi di lavoro Monte Carlo ad alte prestazioni.
- Segretezza in avanti e all'indietro : per i CSPRNG, si verifica se un attaccante che osserva l'output al tempo T può ricostruire l'output passato o futuro. Questo viene testato tentando la ricostruzione dello stato a partire dai bit osservati.
Misurare il successo in contesti applicativi
Oltre alla qualità tecnica, i parametri di successo dipendono dal contesto di implementazione:
- Lotterie ed estrazioni a premi : registri di controllo, verifiche da parte di terzi e certificati di casualità firmati (disponibili su RANDOM.ORG) dimostrano l'equità nei confronti dei partecipanti.
- Applicazioni crittografiche : la conformità alle certificazioni FIPS 140-3 o Common Criteria conferma che la sorgente di entropia e il generatore di numeri pseudo-casuali crittograficamente sicuro (CSPRNG) soddisfano gli standard governativi e di settore.
- Simulazioni scientifiche : riproducibilità (lo stesso seme produce gli stessi risultati) e capacità di superare BigCrush o PractRand con le dimensioni del campione utilizzate nella simulazione.
- Test A/B : i controlli di bilanciamento confermano che i gruppi di trattamento e di controllo sono statisticamente equivalenti rispetto alle covariate pre-esperimento, convalidando che la randomizzazione non ha subito distorsioni.
FAQ
Qual è la differenza tra un generatore di numeri veramente casuali e un generatore di numeri pseudo-casuali?
Un generatore di numeri casuali veri (TRNG) ricava la casualità da un processo fisico imprevedibile, come il rumore termico, il decadimento radioattivo o il rumore radio atmosferico, e produce un output che è genuinamente non deterministico. Un generatore di numeri pseudo-casuali (PRNG) utilizza un algoritmo matematico deterministico con un valore iniziale; dato lo stesso valore iniziale, produce sempre la stessa sequenza. I PRNG sono più veloci e riproducibili, il che li rende ideali per simulazioni e giochi. I TRNG sono più lenti ma necessari quando l'imprevedibilità è un requisito di sicurezza, come ad esempio nella generazione di chiavi crittografiche.
È sicuro utilizzare la funzione Math.random() in JavaScript a fini di sicurezza?
No. Math.random() di JavaScript è un generatore di numeri pseudo-casuali (PRNG) esplicitamente documentato come non crittograficamente sicuro. Il suo stato interno può potenzialmente essere ricostruito dall'output osservato e non dovrebbe mai essere utilizzato per generare password, token di sessione, chiavi API o qualsiasi valore in cui un malintenzionato, indovinando l'output, potrebbe causare danni. Per le applicazioni sensibili alla sicurezza nel browser, utilizzare crypto.getRandomValues() dell'API Web Crypto, che si basa sul generatore di numeri pseudo-casuali crittograficamente sicuro (CSPRNG) del sistema operativo.
Un generatore di numeri casuali può essere davvero imprevedibile?
Un generatore di numeri casuali veri (TRNG) basato su hardware e derivato da fenomeni quantistici, come i tempi di arrivo dei fotoni o le fluttuazioni del vuoto quantistico, è considerato intrinsecamente imprevedibile secondo la meccanica quantistica, il che significa che nessun algoritmo o informazione aggiuntiva potrebbe consentire a un osservatore di prevederne l'output con maggiore precisione rispetto al caso. I generatori di numeri pseudo-casuali (PRNG) e la maggior parte dei generatori di numeri pseudo-casuali crittograficamente sicuri (CSPRNG) basati su software sono computazionalmente imprevedibili secondo le ipotesi crittografiche standard, il che significa che sono sicuri nella pratica ma non dimostrabilmente imprevedibili in senso fisico assoluto.
In che modo il seeding influisce su un generatore di numeri casuali?
Il seed è il valore iniziale fornito a un algoritmo PRNG. Lo stesso seed produce sempre la stessa sequenza, una caratteristica fondamentale nel calcolo scientifico perché rende gli esperimenti riproducibili. Un seed scadente, come ad esempio utilizzare il secondo corrente come unica fonte di entropia, riduce drasticamente la casualità effettiva perché un malintenzionato può enumerare tutti i seed plausibili. Una buona pratica di seeding combina più fonti di entropia: il tempo corrente in nanosecondi, l'ID del processo, gli indirizzi di memoria e l'entropia fornita dal sistema operativo tramite /dev/urandom o CryptGenRandom su Windows.
Quale generatore di numeri casuali utilizza il modulo random di Python?
Il modulo random di Python utilizza l'algoritmo Mersenne Twister (MT19937), che ha un periodo di 2¹⁹⁹³⁷⁻¹ e supera la maggior parte dei test statistici. È adatto per simulazioni, giochi e campionamenti statistici. Tuttavia, non è crittograficamente sicuro: lo stato interno può essere ricostruito dopo aver osservato 624 output consecutivi a 32 bit. Per lavori in Python che richiedono sicurezza, utilizzare il modulo secrets , che si basa su os.urandom() e attinge al CSPRNG a livello di sistema operativo.
Come si generano numeri casuali senza un computer?
Prima dell'avvento dei computer, i numeri casuali venivano generati con metodi fisici: lancio di dadi, estrazione di palline numerate da un tamburo rotante, lancio di monete o mescolamento di carte. La RAND Corporation pubblicò nel 1955 un famoso libro intitolato "A Million Random Digits with 100,000 Normal Deviates" (Un milione di cifre casuali con 100.000 deviazioni normali) , generate da una roulette elettronica. Le tabelle statistiche di numeri casuali erano ampiamente utilizzate nei sondaggi e negli studi clinici. Oggi, i metodi manuali sono ancora impiegati in alcune lotterie regolamentate e nelle dimostrazioni didattiche, sebbene siano più lenti e più difficili da verificare rispetto ai metodi elettronici.
Perché è necessario testare i generatori di numeri casuali?
Anche gli algoritmi progettati per produrre risultati apparentemente casuali possono contenere sottili distorsioni, cicli brevi in determinate dimensioni o correlazioni tra valori successivi che risultano invisibili a un'ispezione superficiale, ma rilevabili con test statistici. Questi difetti possono invalidare i risultati delle simulazioni, ridurre la sicurezza dei sistemi crittografici o introdurre iniquità nei giochi e nelle lotterie. L'esecuzione di test con suite come NIST SP 800-22, BigCrush o PractRand permette di individuare questi problemi prima della distribuzione. Esempi storici di generatori difettosi, tra cui le prime versioni di mt_rand() di PHP e il bug di OpenSSL di Debian del 2008, dimostrano che i generatori di numeri casuali non testati possono causare gravi problemi di sicurezza.
Che cos'è un generatore di numeri pseudo-casuali crittograficamente sicuro (CSPRNG)?
Un CSPRNG è un PRNG che soddisfa due requisiti di sicurezza aggiuntivi oltre alla qualità statistica: il test del bit successivo (nessun algoritmo può prevedere il bit successivo con una probabilità significativamente migliore del 50% dati tutti i bit precedenti) e la resistenza all'estensione di compromissione dello stato (se un attaccante apprende lo stato interno al tempo T, non può ricostruire l'output precedente a T). I moderni CSPRNG includono i generatori basati su ChaCha20 (utilizzati in /dev/urandom di Linux dal kernel 4.8), Fortuna (utilizzato in macOS e iOS) e CTR_DRBG (standardizzato dal NIST nello SP 800-90A).
I generatori di numeri casuali possono produrre valori duplicati?
Sì, e questo è il comportamento previsto. Un processo veramente casuale non ha memoria degli output passati, quindi i duplicati si verificano naturalmente: questo è descritto dal problema del compleanno nella teoria della probabilità. In un'estrazione uniforme da 1 a N, i duplicati diventano probabili dopo che sono stati estratti circa √N valori. Se la tua applicazione richiede valori univoci (come l'assegnazione di ID univoci o la mescolatura di un mazzo di carte senza ripetizioni), dovresti utilizzare un algoritmo di mescolatura come Fisher-Yates su un insieme predefinito, oppure mantenere un insieme di valori già utilizzati ed escludere i duplicati, piuttosto che affidarti all'output grezzo del generatore di numeri casuali per evitare collisioni.
In che modo gli strumenti online per lotterie e concorsi a premi garantiscono l'equità?
Gli strumenti di estrazione online affidabili garantiscono l'equità attraverso una combinazione di fattori: l'utilizzo di una fonte di entropia di alta qualità (idealmente un TRNG piuttosto che Math.random()), la pubblicazione dell'algoritmo e del seed prima dell'estrazione in modo che i risultati possano essere verificati in modo indipendente, la fornitura di certificati di casualità firmati che dimostrano che i numeri sono stati generati prima della chiusura dell'estrazione e lo svolgimento delle estrazioni in presenza di revisori indipendenti. RANDOM.ORG offre un servizio di estrazione di terze parti che appone un timestamp e firma crittograficamente ogni estrazione, creando una registrazione verificabile. Per le lotterie regolamentate, le autorità nazionali di gioco richiedono RNG hardware certificati e l'approvazione di un laboratorio di test indipendente prima che qualsiasi sistema venga attivato.
Stop doing SEO by hand
Put your SEO on autopilot — your first 3 articles for $1
Auto SEO scans your site, builds a content plan, and writes ranking-ready articles automatically. Start your $1 trial — the AI writes your first 3 the moment you begin. Cancel anytime in 3 days.
2,147+ businesses · Cancel anytime · No lock-in