2011-04-13 31 views
38

¿Qué tan bueno se utilizan algoritmos en Javascript Math.random() en diferentes navegadores? ¿Está bien usarlo para generar sales y contraseñas de un solo uso?¿Math.random() es criptográficamente seguro?

la cantidad de bits de un random que pueda usar?

Respuesta

34

Nop; La función de JavaScript Math.random() no es un generador de números aleatorios criptográficamente seguro. Usted es mejor usar la aplicación JavaScript Crypto Library 's Fortuna, que es un generador de números pseudo-aleatorios fuerte (echar un vistazo a src/js/Clipperz/Crypto/PRNG.js), o el Web Crypto API for getRandomValues

+1

Como adendo, sin embargo, no necesita un PRNG criptográficamente seguro para generar una sal. Las sales solo necesitan ser únicas y generarse de manera no determinista. –

+0

Buen punto, pero una vez más, una contraseña corta + sal puede ser víctima de las tablas de arco iris. Cuando se trata de criptografía, siempre es favorable usar RNG criptográficos. –

+1

@Teoman Sin embargo, la longitud de la sal y la contraseña son independientes de la fuente de la sal. Y sí, criptográficamente seguro es generalmente una apuesta más segura. –

3

Porque no se puede conocer la implementación exacta del navegador (excepto para grupos cerrados de usuarios como para su intranet empresarial) me gustaría general, considerar el RNG débil.

Incluso si puede identificar el navegador que no sabe si el propio navegador o agente de cualquier otro navegador ID es manipulado. Si puede, debe generar el número en el servidor.

Incluso si se incluye una buena PRNG JavaScript en su servidor no puede saber si la solicitud del cliente se origina a partir de una secuencia de comandos sin modificar. Si el número entra en su base de datos y/o se utiliza como una herramienta criptográfica, no es una buena idea confiar en absoluto en los datos del cliente. Esto es cierto no sólo para la validez (Haces validar todos los datos que llegan desde el cliente, ¿verdad?), sino también para las características generales como la aleatoriedad.

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 así podría usarlo para rastrear personas en sitios web incluso si no usaban cookies, ocultaron detrás de la cebolla enrutamiento etc ...

+0

Gracias por el enlace, es un buen ejemplo cuán débil podría ser el PRNG de un navegador. – grep

+0

El documento que quería vincular es en realidad el http://www.trusteer.com/files/Temporary_User_Tracking_in_Major_Browsers.pdf más genérico –

+0

editó mi respuesta en realidad ... –

8

A partir de marzo de 2013, window.crypto.getRandomValues es una "tecnología experimental" disponible desde Chrome 11 y Firefox 21 que le permite obtener valores aleatorios criptográficos. Además, vea getRandomValues del borrador más reciente del W3C Web Cryptography API.

Descripción:

Si proporciona una basada en número entero TypedArray (es decir Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, o Uint32Array), la función va llenar la matriz con criptográficamente aleatorio números. Se supone que el navegador usa un generador de números fuerte (pseudo) aleatorio. El método arroja 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]); 
} 

Además, una respuesta a How random is JavaScript's Math.random? refiere a Temporary user tracking in major browsers and Cross-domain information leakage and attacks de 2008, que discute cómo la función de JavaScript Math.random() fugas de información.

Actualización: Para el estado actual de soporte de los navegadores, echa un vistazo a la sección Modern.IE Web Crypto API, que también conecta a los Chrome, Firefox y Safari informes de errores.

1

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

CWE-331 (insuficiente Entropía)

Podríamos hacer uso de SecureRandom para implementar una funcionalidad similar.

new SecureRandom().nextDouble(); 
+0

¿El método SecureRandom() está disponible en JavaScript? –