Español

Texto y herramientas cotidianas · Generador de contraseñas

crypto.getRandomValues vs Math.random: por qué es importante para las contraseñas

· Cómo funciona

contraseñas criptografía web aleatoriedad

Una ruta aleatoria débil que termina mientras una ruta Web Crypto continúa en símbolos de contraseña
Ilustración de vector original de ToolAcre

Explica la diferencia entre el generador de números aleatorios de uso general de un navegador y el generador criptográfico, por qué la previsibilidad es fatal para las contraseñas y cómo saber qué herramienta utiliza.

Lo suficientemente aleatorio para un juego de dados, no para una contraseña: los dos tipos de aleatoriedad que ofrece un navegador

Un navegador puede ofrecer más de una fuente de valores que parecen irregulares, pero el desorden visual no es evidencia de que una secuencia sea adecuada para una credencial. ToolAcre traza un límite estricto para el producto: cada elección de palabra, elección de delimitador, elección de carácter e intercambio aleatorio pasa por una función entera segura respaldada por `crypto.getRandomValues`. Si esa API no se puede utilizar, la página desactiva la generación en lugar de producir un sustituto que parezca plausible.

Esa negativa importa más que si dos resultados de muestra aparecen igualmente confusos. Una fuente predecible aún puede imprimir letras, dígitos y palabras que a una persona le parezcan convincentes. Por lo tanto, la implementación hace que la fuente sea auditable y el fallo visible. No afirma que el valor generado sea seguro para todos los entornos; un navegador o dispositivo comprometido aún puede leer lo que muestra la página.

Para qué sirve Math.random: pseudoaleatoriedad inicial y rápida cuyo resultado se puede reconstruir a partir de unas pocas observaciones.

El libro de trabajo describe Math.random como pseudoaleatoriedad reconstruible a partir de algunas observaciones, pero esas son afirmaciones de implementación generales que este repositorio no establece para todos los motores de JavaScript. El hecho local es más simple y contundente para este producto: los archivos generadores de producción no llaman a `Math.random`. Una tira reactiva a nivel de fuente comenta, escanea el código ejecutable y falla si dicha llamada aparece en cualquier parte del motor o de la aplicación de contraseña.

Esta distinción evita que el artículo convierta una regla de implementación en una conferencia universal sobre la historia del navegador. ToolAcre no necesita caracterizar todos los algoritmos Math.random posibles para rechazar la API para la generación de contraseñas. Su paquete acepta Web Crypto o una fuente segura inyectada utilizada por las pruebas, y no expone ninguna opción de producción para un modo semilla, determinista o respaldo débil.

Lo que este repositorio demuestra sobre Math.random: está ausente en la generación de producción

`createWebCryptoSource` busca un `getRandomValues` invocable y luego envuelve ese método como fuente aleatoria del paquete. La aplicación realiza una prueba adicional antes de habilitar los controles: le pide al objeto criptográfico global que complete una matriz escrita de un elemento dentro de un bloque de prueba. Eso detecta entornos restringidos donde existe la propiedad pero la arroja cuando se usa, en lugar de confiar en una verificación superficial de características.

La fuente se detiene en el límite de la API del navegador. No demuestra qué grupo de sistemas operativos, instrucciones de hardware o diseño de reubicación se encuentran debajo de un navegador en particular. Esos detalles varían debajo de la interfaz y necesitan documentación de la plataforma. Lo que el código sí demuestra es que los bytes llegan a través del método Web Crypto denominado y que no se intenta la generación cuando falla la sonda.

Qué hace crypto.getRandomValues aquí: rellena matrices escritas a través de la API del navegador

La previsibilidad es peligrosa porque se supone que un generador de credenciales debe tomar nuevas decisiones que un observador no puede reproducir a partir de resultados anteriores. ToolAcre respalda ese objetivo rechazando rutas de producción deterministas, centralizando cada extracción y probando que la API débil esté ausente. No promete inmunidad contra capturas de pantalla, extensiones, malware, phishing, reutilización de contraseñas o un servicio que maneje mal la credencial después del envío.

Ese límite evita un error de categoría común: la generación aborda cómo se selecciona un candidato, no todo lo que le sucede después. El paquete devuelve una cadena y no la registra ni la almacena. La página contiene un valor actual en la memoria y lo representa como texto. El almacenamiento de contraseñas, la transmisión, la recuperación de cuentas y la política de autenticación siguen siendo responsabilidad de otros sistemas.

Lectura del código: cómo comprobar qué API utiliza una página y por qué es más fácil confiar en las páginas abiertas e inspeccionables

La lectura del código comienza en `packages/password-generator/src/index.js`, cuyo contrato dice que cada decisión aleatoria llega a `secureRandomInt`. Luego, el archivo de implementación muestra `getRandomValues`, muestreo de rechazo y errores explícitos. Finalmente, `no-math-random.test.js` y el paquete de seguridad de contraseñas más amplio hacen que la garantía negativa sea ejecutable en lugar de dejar "nunca usamos Math.random" como un comentario no probado.

El código abierto por sí solo no hace que el código sea correcto, pero le brinda al revisor puntos concretos para inspeccionar. Busque la fuente aleatoria, siga a las personas que llaman a través de opciones y combinaciones, e inspeccione qué sucede cuando falta la API. Una revisión confiable debería poder nombrar tanto el camino del éxito como el camino del fracaso en lugar de inferir seguridad a partir de la marca.

Ejemplo resuelto: la misma rutina de selección de palabras escrita en ambos sentidos y lo que un atacante podría hacer con cada uno

Considere una solicitud para un número entero inferior a 100. `secureRandomInt` necesita un byte, cuyo rango contiene valores 256. Acepta solo el prefijo más grande divisible por 100, que termina antes de 200, y rechaza la cola restante. Una prueba determinista alimenta el byte 200 seguido del byte 7. La implementación descarta 200 y devuelve 7; un atajo de módulo directo habría devuelto cero del byte rechazado.

La misma función de entero seguro elige índices para palabras y caracteres, por lo que este ejemplo no es un juguete separado de la generación. Los bytes exactos en producción no son ejemplos repetibles y nunca deben publicarse como credencial. El artefacto útil es la prueba de flujo de control: Web Crypto llena el búfer, se rechaza una cola desigual y sólo un valor aceptado se convierte en una elección limitada.

Ejemplo resuelto: rastrear un sorteo limitado a través de la ruta seguraRandomInt enviada

Este repositorio no implementa ni compara generadores del lado del servidor, generadores de números aleatorios de hardware ni herramientas de línea de comandos del sistema operativo. Tampoco puede auditar los aspectos internos de la implementación criptográfica del navegador desde JavaScript. Esos temas necesitan su propio material fuente, modelos de amenazas y comprobaciones operativas en lugar de una analogía pegada en la ruta del código de ToolAcre.

La página tampoco es un administrador de contraseñas. No guarda, sincroniza, transmite ni autocompleta lo que genera. El lector no debe interpretar la “fuente criptográfica aleatoria” como un consejo para reutilizar un resultado o moverlo a través de un canal inseguro. El reclamo pertenece únicamente a la selección dentro de la pestaña actual del navegador.

La conclusión: el generador de contraseñas utiliza el generador criptográfico de números aleatorios del navegador y puede verificarlo desde la propia página.

La elección verificable de ToolAcre es criptografía o nada. La página llama a la API del navegador durante la detección de soporte, desactiva los controles cuando falla y permite que el motor arroje `InsecureRandomError` si la generación de alguna manera alcanza la misma condición faltante. No hay ningún respaldo de Math.random oculto detrás de ninguna de las ramas.

Utilice ese patrón al revisar un generador: identifique la fuente, rastree cada sorteo limitado, inspeccione la reducción y la mezcla, y fuerce la ruta de la fuente no disponible. Luego evalúe el dispositivo y el destino por separado. Se necesita una fuente aleatoria sólida para el trabajo de este generador, pero no es un certificado universal para toda la vida de la credencial.