Aleatoriedad en el navegador

Fundamentos

En qué se diferencia crypto.getRandomValues de Math.random y por qué el segundo no sirve para contraseñas.

Un generador de contraseñas en el navegador despierta una duda razonable: ¿de dónde sale la aleatoriedad y no estará amañada? La pregunta es justa y, a diferencia de casi todo lo que se afirma sobre seguridad, la respuesta se puede comprobar.

Dos generadores distintos

En el navegador hay dos, y no hay que confundirlos.

Math.random()crypto.getRandomValues
Para qué sirveJuegos, animación, barajar una listaSecretos: contraseñas, claves, tokens
FuenteUn algoritmo interno del navegadorEl generador del sistema operativo
PrevisibilidadCon unos pocos valores se deduce el restoNo se reconstruye a partir de sus salidas
Sirve para una contraseñaNo
La diferencia no se ve «a ojo»: ambas secuencias parecen igual de aleatorias. Lo que cambia es la resistencia a la reconstrucción.

De dónde saca aleatoriedad el sistema

El sistema operativo recoge sucesos impredecibles: tiempos de interrupciones, ruido de los dispositivos, una fuente de hardware en el procesador. Con ello mantiene un depósito que se mezcla constantemente.

El navegador no inventa nada: simplemente pide al sistema los bytes que necesita. Así que la calidad del generador en el navegador es la calidad del generador de tu sistema operativo, no una propiedad aparte del navegador.

Por qué no vale un simple módulo

Supongamos que hace falta un carácter de un alfabeto de 62 y el generador devuelve un byte de 0 a 255. Tomar el resto de dividir entre 62 parece razonable, pero 256 no se divide exactamente entre 62.

En el resto, los primeros valores salen cuatro veces cada uno y el resto tres. Los primeros caracteres del alfabeto empiezan a aparecer más a menudo y la entropía acaba siendo menor de la calculada.

La solución se llama descarte: los valores de la «cola» sobrante que no cabe en un número entero de repeticiones del alfabeto se descartan y se pide otro. Es más lento en fracciones de microsegundo y la distribución queda exactamente uniforme. Así funciona el generador de este sitio.

Cómo comprobarlo tú mismo

  1. Mira el código fuente de la página

    Los scripts no están minificados hasta lo irreconocible: en el archivo del generador se ve que lo que se llama es la fuente del sistema.

  2. Abre la pestaña Red en las herramientas de desarrollo

    Genera una contraseña y comprueba que no hay peticiones al servidor. Una contraseña no puede filtrarse a un sitio al que nunca se envía.

  3. Desconecta internet y vuelve a probar

    La comprobación más gráfica: el generador sigue funcionando. Lo que significa que todo se calcula en el navegador.

Copiado