Es Matemáticas.random () ¿criptográficamente seguro?


¿Qué tan buenos son los algoritmos utilizados en Javascript Math.random() en diferentes navegadores? ¿Está bien usarlo para generar sales y contraseñas de un solo uso?

¿Cuántos bits de un random puedo usar?

Author: grep, 2011-04-13

5 answers

No; la función Math.random() de JavaScript no es un generador de números aleatorios criptográficamente seguro. Es mejor usar la implementación de Fortuna de JavaScript Crypto Library que es un fuerte generador de números pseudo-aleatorios (eche un vistazo a src/js/Clipperz/Crypto/PRNG.js), o la Web Crypto API para getRandomValues

 36
Author: Teoman Soygul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:15

No es seguro en absoluto, y en algunos casos era tan predecible que podría reconstruir el estado interno del PRNG, deducir la semilla y, por lo tanto, podría usarlo para rastrear a las personas en los sitios web, incluso si no usaban cookies, se escondían detrás del enrutamiento de cebolla, etc...

 16
Author: Bruno Rohée,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-25 10:13:02

A partir de marzo de 2013, ventana.criptografía.getRandomValues es una "tecnología experimental" disponible desde Chrome 11 y Firefox 21 que le permite obtener valores criptográficamente aleatorios. También, vea getRandomValuesdel último borrador de la API de criptografía web del W3C .

Descripción:

Si proporciona un valor basado en enteros TypedArray (es decir, Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, o Uint32Array), el función va a llenar la matriz con aleatorios criptográficamente numero. Se supone que el navegador está utilizando un fuerte (pseudo) generador de números aleatorios. El método lanza el QuotaExceededError si la longitud solicitada es mayor que 65536 bytes.

Ejemplo:

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]);
}

También, una respuesta a Cuán aleatorio es la Matemática de JavaScript.al azar? se refiere a Seguimiento temporal de usuarios en los principales navegadores y fugas de información entre dominios y ataques de 2008 que analiza cómo el JavaScript Matemáticas.la función random () filtra información.

Actualización: Para conocer el estado actual del soporte del navegador, consulte Modern.IE Web Crypto API sección, que también se vincula a la Chrome, Firefox , y Safari informes de errores.

 8
Author: Kevin Hakanson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:50

Debido a que no puede saber la implementación exacta del navegador (excepto para grupos de usuarios cerrados como para su intranet empresarial), generalmente consideraría que el RNG es débil.

Incluso si puede identificar el navegador, no sabe si el navegador en sí o el ID de agente de cualquier otro navegador está manipulado. Si puede, debe generar el número en el servidor.

Incluso si incluye un buen PRNG en su JavaScript, su servidor no puede saber si se origina la solicitud del cliente de un script sin modificar. Si el número entra en su base de datos y/o se utiliza como una herramienta criptográfica, no es buena idea confiar en los datos del cliente en absoluto. Eso es cierto no solo para la validez ( Usted valida todos los datos que provienen del cliente, ¿no?) pero también para propiedades generales como la aleatoriedad.

 3
Author: Daniel Böhmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-30 10:07:21

Math.random() no es criptográficamente seguro. También Veracode señalará esta ocurrencia con

CWE-331 (Entropía insuficiente)

Podríamos hacer uso de SecureRandom para implementar funcionalidades similares.

new SecureRandom().nextDouble();
 1
Author: DecKno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-17 11:53:16