Español

Texto y herramientas cotidianas · Generador de contraseñas

Explicación del sesgo de módulo: elegir una palabra aleatoria de una lista sin sesgo

· Cómo funciona

contraseñas aleatoriedad criptografía

Cubos con números impares junto a un conjunto par producido después de rechazar una cola
Ilustración de vector original de ToolAcre

Muestra por qué la 'longitud de lista de módulo de números aleatorios' favorece algunas palabras sobre otras cuando el rango no se divide uniformemente, qué tan grande es la asimetría y cómo el muestreo de rechazo la elimina.

Un dado justo y un atajo injusto: por qué tomar un módulo de números aleatorios 7,776 no es lo mismo que tirar un dado

Una fuente justa aún puede alimentar una rutina de selección injusta. Si un programa lee un número entero e inmediatamente toma el resto después de dividirlo por la longitud de una lista, algunos índices reciben más valores de origen siempre que el rango de origen no sea exactamente divisible por esa longitud. El error está en el paso de reducción, no necesariamente en los bytes. ToolAcre evita ese atajo antes de elegir cualquier palabra EFF.

Los dados físicos proporcionan una comparación intuitiva solo cuando los grupos de resultados completos se asignan de manera uniforme. La implementación del navegador tiene un rango sin procesar diferente, por lo que calcula una ventana de aceptación para el límite solicitado. Este artículo analiza ese mecanismo incluido en lugar de afirmar que los bytes del navegador reproducen literalmente cinco dados. Ambos pueden seleccionar índices, pero sus procedimientos y evidencia de auditoría son distintos.

De dónde viene el sesgo: un valor de 32 bits no se divide uniformemente en 7,776 depósitos, por lo que las primeras palabras tienen una oportunidad adicional

Para un byte y un límite de 100, el rango sin formato tiene 256 valores posibles. Caben dos grupos completos de 100, dejando valores 56. La reducción de cada módulo de bytes 100 da a los índices de cero a 55 tres preimágenes cada uno, mientras que los índices de 56 a 99 reciben solo dos. Los bytes de entrada pueden ser uniformes, pero la distribución del depósito seleccionado no lo es.

El comentario de implementación también deriva el problema de rango finito correspondiente para una lista de entradas 7,776 cuando se reducen dos bytes directamente. Esas cifras provienen de los rangos reales mencionados en la fuente, no de una tasa de ataque supuesta. La pregunta de revisión importante es si se utilizan los valores sobrantes, no si la desviación parece pequeña en un puñado de frases generadas.

Qué tan grande es el efecto: pequeño para un rango aleatorio grande, pero distinto de cero, y por qué el código criptográfico se niega a aceptarlo

Las pruebas deterministas hacen observable la cola desigual. Los límites 3, 5, 7, 100 y 7,776 son deliberadamente incómodos, mientras que un límite de potencia de dos demuestra el caso de no rechazo. Otro control estadístico utiliza la misma fuente Web Crypto para la función correcta y un módulo auxiliar ingenuo, por lo que la prueba aísla la estrategia de reducción en lugar de culpar a la fuente de entropía.

ToolAcre no convierte esas comprobaciones de distribución en una predicción del tiempo de crack. El sesgo reduce la uniformidad, pero traducir esa reducción en el costo de un atacante en particular requiere un modelo de amenaza completo. El requisito de ingeniería es más claro: cada índice elegible debe tener la misma cantidad de valores brutos aceptados, y el código puede exigir eso exactamente.

Los ejemplos de sesgo verificados en los comentarios de implementación y pruebas deterministas

`secureRandomInt` encuentra el recuento de bytes completo más pequeño capaz de representar el índice válido más alto. Calcula el rango de bytes, resta el resto después de la división por el límite y llama al resultado `limit`. Los valores por debajo de ese límite pertenecen a grupos completos; los valores iguales o superiores se descartan antes de que se permita ejecutar la operación del módulo.

Un nuevo sorteo sigue a cada rechazo. El bucle tiene un techo alto y fijo, por lo que una fuente inyectada rota no puede colgar la pestaña para siempre; después de repetidos valores fuera de rango, arroja en lugar de devolver una respuesta sesgada. Esta ruta de error es parte de la corrección: rechazar una fuente sospechosa preserva la promesa de que un índice devuelto proviene de la ventana de aceptación uniforme.

Alternativas: extraer exactamente suficientes bits y descartar valores fuera de rango, o usar la función entera uniforme de una biblioteca

Otros diseños de enteros uniformes son posibles, pero no son el comportamiento de este paquete y, por lo tanto, no se presentan como opciones intercambiables de ToolAcre. El motor expone una ruta auditada. `secureRandomChoice` valida que su entrada sea una matriz no vacía y delega en `secureRandomInt(items.length)`, haciendo que la selección de palabras sea un consumidor directo del contrato de entero acotado.

El generador de contraseñas aleatorias utiliza la misma ruta para los caracteres y luego invoca una combinación Fisher-Yates impulsada por intercambios limitados seguros. No utiliza `sort` con un comparador aleatorio. Mantener una primitiva debajo de varias características hace que la revisión de una fuente sea manejable: corrija o pruebe la reducción uniforme una vez, luego siga a quienes la llaman.

Los diseños alternativos están fuera de este módulo; la ruta enviada utiliza muestreo de rechazo

La prueba de regresión enlazada-100 proporciona cada byte de cola desde 200 hasta 255 y luego un 42 final. El código correcto consume todos los 56 bytes rechazados y las respuestas de 42. Un segundo caso específico proporciona 200 y 7; debido a que 200 módulo 100 sería cero, devolver 7 demuestra que el primer byte fue rechazado en lugar de reducido silenciosamente.

Este ejemplo resuelto es determinista por diseño y no contiene ninguna credencial. Los bytes de producción permanecen privados para la llamada del navegador y no se registran. La fuente de prueba es inyectable sólo para que se pueda forzar el comportamiento en el límite; el paquete público no ofrece ningún modo de producción inicial que pueda reproducir una frase de contraseña generada.

Ejemplo resuelto: enlazado 100 rechaza el byte 200 y acepta el siguiente 7

La reducción aleatoria de punto flotante, las API uniformes específicas de la biblioteca y los algoritmos de mezcla no relacionados quedan fuera de esta implementación. Evaluarlos requeriría su fuente y contratos. El código de ToolAcre está basado en números enteros y está explícitamente limitado, por lo que agregar un estudio de alternativas desdibujaría la afirmación limitada que las pruebas realmente demuestran.

El artículo tampoco infiere que una contraseña generada uniformemente sea adecuada para cada política o dispositivo. La selección de índice uniforme aborda un mecanismo. El almacenamiento, la reutilización, el manejo del portapapeles, el malware y las limitaciones de destino siguen siendo cuestiones separadas incluso cuando cada elemento de la lista tenía las mismas posibilidades de selección.

La conclusión: un generador de frases de contraseña debe elegir las palabras de manera uniforme; Consulte las notas técnicas de la herramienta para saber cómo lo hace el generador de contraseñas.

Un generador de frases de contraseña no debe favorecer las entradas anticipadas simplemente porque su rango sin procesar deja un resto. ToolAcre toma bytes de Web Crypto, rechaza la cola incompleta y reduce solo los valores dentro de grupos completos del mismo tamaño. Las pruebas imponen límites tanto de rechazo como de aceptación, por lo que la afirmación no se basa en una inspección visual de los resultados.

Al revisar código similar, calcule el rango sin procesar para el ancho de bytes elegido, divídalo por el límite solicitado y busque un resto descartado. Si no se rechaza ninguna cola, se exige otra prueba de uniformidad. La lista de palabras puede ser pública y la fuente criptográfica, mientras que una reducción descuidada todavía introduce un sesgo evitable.