C'è un buon modo per generare in modo crittografato forti numeri pseudocasuali (o veri casuali) in Javascript?
Il requisito fondamentale: se JavaScript di a.com genera numeri casuali, nessun altro dovrebbe essere in grado di prevedere quei numeri casuali. Ad esempio, Javascript su evil.com non dovrebbe essere in grado di prevedere i numeri casuali ottenuti da a.com.
Riepilogo di ciò che so su questo argomento. Ecco cosa sono stato in grado di trovare, nella mia ricerca:
-
Tutti i browser forniscono
Math.random()
come chiamata di libreria per generare numeri pseudocasuali. Sfortunatamente, non fornisce numeri casuali di crittografia e fallisce il requisito di cui sopra. Nei browser che ho visto,Math.random()
utilizza un PRNG non crittografico e il suo stato interno è condiviso su più siti. Pertanto, evil.com può chiamareMath.random()
un sacco di volte, recuperare lo stato interno del PRNG e quindi inferire quali numeri casuali ha ottenuto a.com quando ha chiamatoMath.random()
. Inoltre, usa un PRNG di qualità non crittografica, quindi se a.com genera una chiave casuale e un IV casuale usandoMath.random()
e quindi pubblica l'IV, potrebbe essere possibile inferire lo stato interno del PRNG (dall'IV) e quindi recuperare la chiave. Quindi,Math.random()
è giusto. -
Ho trovato un documento di ricerca che esamina la crittografia in Javascript. Il loro codice, Libreria crittografica Javascript di Stanford , è disponibile pubblicamente. Include un numero pseudocasuale crittografico.
Tuttavia, sembra avere una grossa limitazione: se sto leggendo la carta correttamente, ci vogliono 10-40 secondi di interazione dell'utente con il tuo sito prima che il numero pseudocasuale venga adeguatamente seminato. Inoltre, ogni sito deve ricominciare da capo: se a.com include la libreria SJCL, sembra che lo script di a.com debba attendere che l'utente interagisca con il sito di a.com per 10-40 secondi (in genere) prima che a.com possa generare numeri casuali di criptografia. Questa è una limitazione piuttosto significativa.
Ecco il loro articolo:
- Emily Stark, Michael Hamburg, Dan Boneh. Crittografia simmetrica rapida in Javascript . ACSAC 2009.
-
Il saggio classico, Javascript Cryptography Considerato Nocivo , accenna alla mancanza di un buon metodo per ottenere i numeri casuali della crittografia in Javascript come ostacolo principale alla crittografia sicura in Javascript. Il saggio considera diversi approcci ovvi e spiega perché sono difettosi.
La conclusione è che non conosco alcuna soluzione ragionevole; le opzioni che ho trovato sembrano tutte piuttosto problematiche. Tuttavia, sono passati diversi anni da quando sono stati scritti quei saggi e articoli, e so che la tecnologia web può cambiare rapidamente. Qualcuno sa di una buona soluzione a questo problema?