Using computer random number generators to produce keys, it is secure?
Dipende dall'ambiente, dall'esposizione e dalla sicurezza generale del sistema. Data la difficoltà nell'implementazione di robusti sistemi sicuri, e supponendo che la cosa che stai proteggendo non sia di alto valore (per gli altri), usare il tuo computer per generare numeri casuali è probabilmente ok. Tuttavia, se la minaccia al tuo sistema è elevata, la tua esposizione è ottima e la cosa che stai proteggendo è di alto valore, allora no, l'uso di numeri casuali generati dal computer non è sicuro.
Does generating an encryption key using the random number generator on one's computer
present a security risk?
Sì, ma potrebbe non essere un rischio abbastanza significativo per fare qualcosa al riguardo. Vedi la parte successiva della risposta.
If so how might that risk be mitigated, specifically when generating RSA
key pairs in .Net?
Nella crittografia RSA la chiave privata e la chiave pubblica sono collegate matematicamente. Sono necessari numeri casuali per generare la coppia di chiavi privata-pubblica. Se un utente malintenzionato aveva i numeri casuali usati per generare la coppia di chiavi e la chiave pubblica, potevano facilmente trovare la chiave privata.
Il framework .Net di Microsoft fornisce RNGCryptoServiceProvide per la generazione casuale di numeri. Tutti i generatori di numeri casuali basati su software sono in realtà generatori di numeri pseudo-casuali. Significa che non sono veramente casuali, ma producono output in un modo che rende l'output casuale.
Tutto il software è deterministico. Significa che per un determinato set di input l'output può essere determinato esattamente. Ciò è male per prng (generatori di numeri pseudo-casuali), perché produrrebbero un output prevedibile. cioè l'output non sarebbe nemmeno pseudo-casuale. Per superare questa limitazione, è necessario disporre di dati casuali per iniziarli.
Dando alla funzione prng un po 'di dati casuali per iniziare può generare molti numeri pseudo-casuali. Esistono molti metodi per generare dati seme casuali: utilizzando il tempo in cui la funzione è stata chiamata, leggendo un blocco di memoria non inizializzata, utilizzando il tempo medio di tempo tra le pressioni della tastiera, la posizione del mouse, ecc. Generalmente i dati utilizzati per generare il casuale non è neanche perfettamente casuale.
Se un utente malintenzionato conosceva l'algoritmo utilizzato per produrre i numeri casuali e i dati seme, potrebbe essere in grado di ridurre i possibili output del prng e utilizzare l'output impostato ridotto per trovare facilmente la chiave privata.
Non so quale algoritmo rpng sia usato da RNGCryptoServiceProvide, quindi non posso parlarne con l'efficacia.
Per mitigare il rischio dovuto alla generazione di numeri casuali, è possibile utilizzare generatori di numeri casuali basati su hardware reali. I generatori di numeri casuali basati su hardware non richiedono un seed, perché invece di un algoritmo usano un processo fisico per generare i loro dati. Alcuni processi fisici hanno caratteristiche casuali o quasi casuali: decadimento di una particella radioattiva, rumore termico, condizioni di competizione nei transistor, ecc. L'output dei generatori di numeri casuali basati su hardware sarà statisticamente più casuale dei numeri generati dal computer. Inoltre, nessun valore disponibile sul tuo computer viene utilizzato per generare l'output. Tuttavia, molti generatori di numeri casuali hardware sono costosi e lenti.
Quindi, il costo in denaro e la velocità valerebbero l'investimento?
Dipende da cosa stai proteggendo e da quanto sofisticati e determinati possono essere i tuoi aggressori.
Nota: alcuni chipset per computer ora includono generatori di numeri casuali hardware.