Si parece sembrar el RNG con window.crypto , que si no está disponible window.msCrypto se usa y finalmente cae volver a la hora actual. El código relevante es:
var rng_state;
var rng_pool;
var rng_pptr;
// Mix in a 32-bit integer into the pool
function rng_seed_int(x) {
rng_pool[rng_pptr++] ^= x & 255;
rng_pool[rng_pptr++] ^= (x >> 8) & 255;
rng_pool[rng_pptr++] ^= (x >> 16) & 255;
rng_pool[rng_pptr++] ^= (x >> 24) & 255;
if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;
}
// Mix in the current time (w/milliseconds) into the pool
function rng_seed_time() {
rng_seed_int(new Date().getTime());
}
// Initialize the pool with junk if needed.
if(rng_pool == null) {
rng_pool = new Array();
rng_pptr = 0;
var t;
if(typeof(navigator) != 'undefined' && navigator.appName == "Netscape" && navigator.appVersion < "5" && typeof(window) != 'undefined' && window.crypto) {
// Extract entropy (256 bits) from NS4 RNG if available
var z = window.crypto.random(32);
for(t = 0; t < z.length; ++t)
rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;
}
//First try to use browser's PRNG over Math.random
try{
var crypt_obj = null;
if (typeof(window) != "undefined" && typeof(window.crypto) != "undefined") {
crypt_obj = window.crypto;
} else if (typeof(window) != "undefined" && typeof(window.msCrypto) != "undefined") {
crypt_obj = window.msCrypto;
}
if(typeof(crypt_obj) != 'undefined' && typeof(crypt_obj.getRandomValues) == 'function') {
if(rng_pptr < rng_psize){
var num = Math.floor((rng_psize - rng_pptr) / 2) + 1;
var buf = new Uint16Array(num);
crypt_obj.getRandomValues(buf);
for(var i = 0; i < buf.length; i++){
var t = buf[i];
rng_pool[rng_pptr++] = t >>> 8;
rng_pool[rng_pptr++] = t & 255;
}
}
}
}catch(e){}
//Fall back to Math.random if needed
while(rng_pptr < rng_psize) { // extract some randomness from Math.random()
t = Math.floor(65536 * Math.random());
rng_pool[rng_pptr++] = t >>> 8;
rng_pool[rng_pptr++] = t & 255;
}
rng_pptr = 0;
rng_seed_time();
//rng_seed_int(window.screenX);
//rng_seed_int(window.screenY);
}
Window.crpto
es parte de API de criptografía web :
[La especificación de la API de criptografía web] describe una API de JavaScript para realizar operaciones criptográficas básicas en aplicaciones web, como hash, generación y verificación de firmas, y cifrado y descifrado. Además, describe una API para que las aplicaciones generen y / o administren el material de claves necesario para realizar estas operaciones. Los usos de este API van desde la autenticación de usuarios o servicios, la firma de documentos o códigos, y la confidencialidad e integridad de las comunicaciones.
window.msCrypto
es la implementación de Microsoft de esto.
Si está utilizando un navegador compatible, este método de generación parece seguro (también es tan seguro como la implementación de la API de criptografía web de su navegador). De lo contrario, parece que usa Math.random
sembrado con la hora actual, lo cual no es seguro. Sería bueno que la página web le advirtiera si este fuera el caso.
Esta página muestra el estado actual de la compatibilidad del navegador para la API de criptografía web .