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é sirve | Juegos, animación, barajar una lista | Secretos: contraseñas, claves, tokens |
| Fuente | Un algoritmo interno del navegador | El generador del sistema operativo |
| Previsibilidad | Con unos pocos valores se deduce el resto | No se reconstruye a partir de sus salidas |
| Sirve para una contraseña | No | Sí |
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
-
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.
-
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.
-
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.