Math.random () è crittograficamente sicuro?

Quanto sono validi gli algoritmi utilizzati in JavaScript Math.random() in diversi browser? Va bene usarlo per generare sali e password monouso?

Quanti bit da un random posso usare?

No; La funzione Math.random() di JavaScript non è un generatore di numeri casuali protetto da crittografia. Stai meglio usando l’implementazione Fortuna della JavaScript Crypto Library che è un potente generatore di numeri pseudo-casuali (dai un’occhiata a src/js/Clipperz/Crypto/PRNG.js ) o all’API Web Crypto per getRandomValues

  • Ecco una spiegazione dettagliata: quanto è affidabile l’implementazione casuale di javascript in vari browser?
  • Ecco come generare un buon numero casuale di crittografia: Numeri casuali sicuri in javascript?

Non è affatto sicuro e in alcuni casi era così prevedibile che era ansible ribuild lo stato interno del PRNG, dedurre il seed e quindi utilizzarlo per tenere traccia delle persone attraverso i siti Web anche se non utilizzavano i cookie, nascosti dietro il routing della cipolla, ecc. …

A partire da marzo 2013, window.crypto.getRandomValues è una “tecnologia sperimentale” disponibile da Chrome 11 e Firefox 21 che consente di ottenere valori casuali crittografici. Inoltre, vedi getRandomValues ​​dall’ultima bozza dell’API di crittografia Web W3C.

Descrizione:

Se si fornisce un TypedArray basato su valori interi (ad esempio Int8Array , Uint8Array , Int16Array , Uint16Array , Int32Array o Uint32Array ), la funzione sta andando a riempire l’array con numeri casuali crittograficamente. Il browser dovrebbe utilizzare un potente generatore di numeri casuali (pseudo). Il metodo genera il QuotaExceededError se la lunghezza richiesta è maggiore di 65536 byte.

Esempio:

 var array = new Uint32Array(10); window.crypto.getRandomValues(array); console.log("Your lucky numbers:"); for (var i = 0; i < array.length; i++) { console.log(array[i]); } 

Inoltre, una risposta a Come casuale è Math.random di JavaScript? fa riferimento al monitoraggio temporaneo degli utenti nei principali browser e alla fuga di informazioni tra domini e attacchi dal 2008, che illustra come la funzione Math.random () di JavaScript trapelasse informazioni.

Aggiornamento: per lo stato attuale del supporto del browser, consulta la sezione API Crypto Web di Modern.IE , che si collega anche ai rapporti sui bug di Chrome , Firefox e Safari .

Poiché non puoi conoscere l’esatta implementazione del browser (ad eccezione dei gruppi di utenti chiusi come per la tua intranet aziendale), in genere considererei l’RNG debole.

Anche se è ansible identificare il browser, non si sa se il browser stesso o l’ID di un altro agente viene manipolato. Se è ansible, dovresti generare il numero sul server.

Anche se includi un buon PRNG nel tuo JavaScript, il tuo server non può sapere se la richiesta proveniente dal client proviene da uno script non modificato. Se il numero va nel tuo database e / o viene utilizzato come strumento di crittografia, non è affatto una buona idea fidarsi dei dati del client. Questo è vero non solo per la validità ( si convalidano tutti i dati provenienti dal client, non è vero? ) Ma anche per le proprietà generali come la casualità.

Math.random() non è crittograficamente sicuro. Anche Veracode punterà questa occorrenza con

CWE-331 (entropia insufficiente)

Potremmo utilizzare SecureRandom per implementare funzionalità simili.

 new SecureRandom().nextDouble();