Volver al Centro de conocimiento
Huella digital

Modo determinista: huellas reproducibles del navegador

Cómo una semilla de ruido fija mantiene reproducibles Canvas, WebGL, Audio y métricas de texto entre sesiones, y cómo comprobar que una semilla se repite y otra cambia la salida.

BotBrowser Team

Documentación

Quieres la documentación estructurada de Huella digital?

Este artículo forma parte de la biblioteca editorial. Para pasos de configuración, material de referencia y actualizaciones continuas, entra en la sección de docs.

BotBrowser puede repetir ruido visible del navegador con semilla en un contexto controlado, pero no hace idénticos distintos builds, perfiles, máquinas ni decisiones de sitios; este artículo fija ese límite.

TL;DR

Usa un --bot-noise-seed positivo con el mismo perfil y compilación cuando una ejecución controlada deba repetir Canvas, WebGL, Audio y métricas de texto; cambiar la semilla debe ser una decisión explícita.

Contents

Contenido

Por qué importa el ruido reproducible

El ruido de huella tiene dos funciones que tiran en direcciones opuestas. Las pequeñas variaciones en Canvas, WebGL, Audio y las mediciones de texto evitan que un navegador presente la salida cruda de una sola máquina. Una prueba o un flujo de trabajo largo necesita lo contrario: la misma salida cuando lo ejecutas de nuevo mañana. Si cada lanzamiento genera ruido nuevo, no puedes saber si un resultado distinto viene de tu configuración, de la página que pruebas o del propio ruido. BotBrowser puede repetir la misma configuración con semilla en un contexto controlado para que las ejecuciones sigan siendo comparables; no hace que los resultados sean idénticos entre compilaciones, plataformas o hardware distintos.

Una semilla de ruido resuelve ese conflicto. Es un único entero que inicializa un generador de números pseudoaleatorios, de modo que la secuencia de valores de ruido queda fijada por la semilla. Dos lanzamientos con la misma semilla aplican la misma variación al mismo dibujo o a la misma medición, y una semilla distinta aplica otra variación. Tú decides cuándo la salida debe repetirse y cuándo debe cambiar.

Quienes trabajan en privacidad y pruebas suelen recurrir a una semilla fija en cuatro situaciones:

  • Continuidad de sesión. Volver a un servicio a lo largo de varios lanzamientos presentando cada vez la misma salida de Canvas, WebGL, Audio y métricas de texto.
  • Identidades estables y distintas. Dar a cuentas o usuarios de prueba separados su propio patrón de ruido, que no cambia entre lanzamientos.
  • Comprobaciones de configuración. Confirmar que un perfil y un conjunto de opciones producen la salida esperada, y que cambiar la semilla produce algo diferente.
  • Experimentos reproducibles. Eliminar el ruido de huella como variable al comparar dos versiones, dos páginas o dos perfiles.

Una semilla de ruido alimenta un generador pseudoaleatorio que gobierna el ruido de Canvas 2D, WebGL, Audio y métricas de texto, de modo que la misma versión, perfil y semilla repiten la misma salida

Las secciones siguientes recorren la semilla desde las superficies que toca, pasando por la elección de valores y los argumentos de lanzamiento, hasta una rutina de verificación y los límites que conviene planificar. La referencia es la documentación pública de reproducibilidad de la semilla de ruido, y el comportamiento de Canvas se describe en la referencia de la API Canvas de MDN que aparece en las fuentes.

Qué controla la semilla y qué deja intacto

La opción --bot-noise-seed se aplica a las superficies en las que BotBrowser añade ruido:

  • Canvas 2D. Formas, texto y lectura de píxeles mediante toDataURL(), toBlob() y getImageData().
  • WebGL y WebGPU. La salida renderizada que una página lee de una superficie de dibujo.
  • Audio. Valores de muestra producidos por el procesamiento de audio, por ejemplo un renderizado con OfflineAudioContext.
  • Métricas de texto. Mediciones devueltas por measureText(), getBoundingClientRect() y getClientRects().

La semilla repite el ruido para el mismo contenido. Mantén separadas las observaciones aleatorias en Observabilidad de la aleatoriedad criptográfica y huellas del navegador. Una página que dibuja la misma escena con la semilla 42 en dos sesiones lee los mismos píxeles. La misma escena con la semilla 43 lee píxeles distintos que son igual de estables. Por eso una página de verificación debe dibujar una escena fija: si el contenido cambia entre ejecuciones, la salida cambia por motivos que no tienen que ver con la semilla.

La semilla no toca los valores que vienen del perfil. Las propiedades de navigator, las dimensiones de pantalla y la cadena de user agent se leen del perfil y son iguales en cada lanzamiento, sea cual sea la semilla. El almacenamiento, las cookies y el estado de sesión son otro asunto. Viven en el directorio indicado con --user-data-dir y en los valores cargados con --bot-cookies, así que una semilla no restaura un inicio de sesión ni recuerda una visita anterior.

Cada canal de ruido tiene además su propio interruptor en la referencia de línea de comandos: --bot-noise-canvas, --bot-noise-webgl-image, --bot-noise-audio-context, --bot-noise-client-rects y --bot-noise-text-rects. Aceptan true o false. La semilla decide cómo es el ruido, y los interruptores deciden qué superficies reciben ruido, de modo que ambos controles responden a preguntas distintas.

El propio valor tiene dos reglas. El rango válido va de 1 a 4294967295, el mayor entero sin signo de 32 bits. Un valor de 0 se comporta de otra manera: mantiene el ruido activo con los valores por defecto del perfil pero sin siembra determinista, así que no se espera que la salida se repita entre sesiones. Si necesitas repetibilidad, elige un entero positivo y pásalo en cada lanzamiento.

El tiempo se controla por separado. --bot-time-seed toma un entero de 1 a 4294967295 para una política reproducible de tiempos de ejecución, y 0 la desactiva. --bot-time-scale toma un número decimal inferior a 1.0 para escalar esa política. --bot-stack-seed acepta profile, real o un entero positivo para el comportamiento de la profundidad de pila. Son controles independientes: una semilla de ruido por sí sola no hace que los tiempos se repitan, y una semilla de tiempo no cambia la salida de Canvas. Cuando una prueba necesita que se repitan tanto el ruido de renderizado como los tiempos, define ambos valores a propósito y registra los dos. Para ver cómo performance.now, hardwareConcurrency y deviceMemory se combinan en una señal de tiempo y cómo verificar el tiempo reportado, consulta Huella del navegador: señales de tiempo, CPU y memoria.

Cómo elegir semillas para identidades estables

Registra junto a cada asignación la ruta exacta de --bot-profile, el entero --bot-noise-seed, --user-data-dir y la compilación de BotBrowser; cambiar cualquiera de esas cuatro entradas cambia lo que puede demostrar la comparación.

Una forma práctica de pensar en el par es que el perfil define la clase de dispositivo y la semilla define el patrón de ruido dentro de esa clase. El perfil A con la semilla 100 es una huella estable y reproducible. El perfil A con la semilla 200 comparte los valores del perfil pero tiene otro patrón de ruido. El perfil B con la semilla 100 tiene una base distinta y, por tanto, una salida distinta, aunque el valor de la semilla sea el mismo. Una semilla nunca hace que dos perfiles diferentes produzcan la misma huella, porque los valores base siguen siendo distintos.

Un plan pequeño para tres sesiones podría ser este:

  • Sesión uno: perfil A con la semilla 100, para la primera cuenta o usuario de prueba.
  • Sesión dos: perfil A con la semilla 200, para una segunda cuenta que debe conservar su propio patrón de ruido.
  • Sesión tres: perfil B con la semilla 100, para otra clase de dispositivo que reutiliza un valor de semilla.

Unos pocos hábitos mantienen fiable ese plan con el tiempo. Genera cada semilla una sola vez y guárdala junto a la cuenta o el caso de prueba al que pertenece, porque la semilla no se puede recuperar después a partir de la salida. No derives una semilla de algo que cambia, como una marca de tiempo o un contador que se reinicia, ya que eso devuelve en silencio una configuración determinista a un valor distinto en cada lanzamiento. No reutilices una misma semilla en sesiones que deben tener patrones de ruido separados. Y guarda la asignación de semillas en el mismo lugar que el nombre del archivo de perfil, para poder reconstruir el par exacto en el futuro. Para saber cómo asignar semillas a identidades sin crear vínculos y cómo repetir ejecuciones en CI, consulta Reproducibilidad de la semilla de ruido en ejecuciones repetibles.

Cuando un solo proceso del navegador necesita más de una identidad, la huella por contexto (ENT Tier3) permite que cada BrowserContext lleve su propio --bot-noise-seed. La documentación muestra las opciones definidas para un contexto antes de crear su primera página, de modo que el renderizador arranca con los valores correctos. Un segundo contexto con otra semilla produce entonces un patrón distinto pero igual de reproducible.

Las semillas son valores de configuración corrientes. No tienen que ser consecutivas, y sirve cualquier entero positivo dentro del rango válido. Tampoco son credenciales: quien disponga de la misma versión, el mismo perfil y la misma semilla puede reproducir el mismo patrón de ruido, que es justo el objetivo de una configuración reproducible. Trátalas como el resto de la configuración de pruebas, versiónalas junto con el conjunto y manténlas fuera de lugares donde sea probable una reutilización accidental.

Ten presente el alcance de una semilla. Semillas distintas dan patrones de ruido distintos sobre los mismos valores de perfil, lo cual no equivale a navegadores sin relación. Las cookies, el almacenamiento, la ruta de red y el comportamiento de la persona o del script que usa el navegador son señales aparte, y una semilla no gestiona ninguna de ellas.

Lanzar con una semilla fija

El lanzamiento determinista más pequeño pasa un perfil y una semilla. Un directorio de datos de usuario nuevo deja fuera de la comparación el estado anterior del navegador:

chromium-browser \
  --bot-profile="path/to/profile.enc" \
  --bot-noise-seed=42 \
  --user-data-dir="$(mktemp -d)"

Cuando también deben repetirse los tiempos, añade los controles independientes de tiempo y de profundidad de pila con sus propios valores:

chromium-browser \
  --bot-profile="path/to/profile.enc" \
  --bot-noise-seed=42 \
  --bot-time-seed=42 \
  --bot-stack-seed=profile

Dos sesiones simultáneas que deben mantener identidades distintas usan semillas distintas y directorios de datos de usuario separados. La semilla y el directorio son controles diferentes: la primera fija el patrón de ruido, el segundo guarda cookies y almacenamiento.

chromium-browser --bot-profile="path/to/profile.enc" --bot-noise-seed=1001 --user-data-dir="tmp/session-a" &
chromium-browser --bot-profile="path/to/profile.enc" --bot-noise-seed=1002 --user-data-dir="tmp/session-b" &

Los frameworks de automatización pasan las mismas opciones como argumentos de lanzamiento junto a la ruta del ejecutable de la versión de BotBrowser. Defínelas en los argumentos de lanzamiento y no después de abrir una página. La semilla no cambia la forma en que el framework controla la página.

A veces necesitas salida determinista en algunas superficies y el renderizado propio del equipo en otras. Los interruptores por superficie aceptan true o false, y una superficie que desactives deja de estar gobernada por la semilla:

chromium-browser \
  --bot-profile="path/to/profile.enc" \
  --bot-noise-seed=42 \
  --bot-noise-canvas=false \
  --bot-noise-audio-context=false

Considera esta última forma un paso de diagnóstico. Si el resultado de una prueba deja de repetirse, desactivar un canal cada vez muestra qué superficie es la responsable. Vuelve a activar los canales antes de apoyarte en la configuración y guarda en tus notas el comando de lanzamiento final para poder reutilizar los mismos argumentos. El objetivo es una única línea de comandos que puedas pegar en una segunda sesión y esperar que se comporte igual.

Verificar la reproducibilidad

La verificación solo significa algo si la página sometida a prueba es estable. Usa una página que controles, o una página de pruebas de huella en la que confíes para dibujar la misma escena cada vez. Debe dibujar una escena fija de Canvas, leer una escena fija de WebGL, renderizar un búfer de audio fijo sin conexión y medir una cadena fija. Anota los valores que informa, o un resumen corto de cada uno, para que las comparaciones sean exactas. Ejecuta la página siempre de la misma manera, con el mismo tamaño de ventana y el mismo orden de carga, de modo que la única diferencia deliberada entre ejecuciones sea la semilla. Para ver cómo las diferencias de AudioContext y OfflineAudioContext forman una huella de audio y cómo comprobar su coherencia, consulta Huella de audio explicada: cómo AudioContext te rastrea.

  1. Lanza con un perfil y --bot-noise-seed=42, carga la página y anota los valores de Canvas, WebGL, Audio y métricas de texto.
  2. Cierra el navegador, vuelve a lanzar con el mismo perfil y la misma semilla y carga la misma página. Todos los valores anotados deben coincidir con la primera ejecución.
  3. Cambia la semilla a --bot-noise-seed=43 y ejecuta la página una tercera vez. Los valores deben diferir de la primera ejecución, lo que confirma que la semilla es la que da forma a la salida.
  4. Lanza dos veces con --bot-noise-seed=0. Se espera que la salida varíe entre esas sesiones, porque 0 mantiene el ruido activo sin siembra determinista.
  5. Guarda junto a los resultados la versión de BotBrowser, el archivo de perfil, el sistema operativo del equipo y la lista completa de argumentos.

El último paso es el que mucha gente omite, y es el que hace fácil explicar una discrepancia posterior. Un resultado solo es comparable con otro cuando la versión, el perfil, la semilla y los argumentos de lanzamiento son los mismos.

Cuando una segunda sesión no coincide con la primera, repasa las explicaciones sencillas antes de sospechar de la semilla. Comprueba que la ruta y la versión del perfil son las mismas, que ningún framework inyecta argumentos adicionales y que la página dibuja el mismo contenido cada vez. Compara la versión de BotBrowser, el sistema operativo de destino del equipo y la lista completa de argumentos. La documentación también recomienda mantener estables el proxy, la configuración regional y la zona horaria, y la carga de la máquina mientras comparas ejecuciones, porque pueden cambiar lo que hace una página aunque la semilla no haya cambiado.

Repite la rutina siempre que cambie una de las entradas: actualizar BotBrowser, sustituir un archivo de perfil, cambiar de máquina o editar los argumentos de lanzamiento. Una comprobación breve tras cada cambio es más barata que descubrir una deriva a mitad de una prueba larga, y mantiene acotada la causa de cualquier diferencia, porque solo se movió una entrada.

Un registro que permita reconstruir una sesión necesita pocos campos por cada semilla:

  • El valor de la semilla y la cuenta o el caso de prueba al que pertenece.
  • El nombre del archivo de perfil y su versión.
  • La versión de BotBrowser que usaste.
  • El sistema operativo de destino del equipo y el tipo de máquina.
  • La lista completa de argumentos de lanzamiento, incluida cualquier semilla de tiempo o de pila.
  • Los valores que informó la página de verificación, con la fecha de la ejecución.

Con ese registro, una actualización pasa a ser una comparación en lugar de una sorpresa. Ejecuta la página de verificación en la nueva versión con la semilla guardada y compárala con los valores guardados. Si coinciden, sigue adelante. Si difieren, trata los nuevos valores como una nueva referencia, anota la versión que los produjo y no modifiques la semilla para intentar recuperar la salida anterior, porque la semilla nunca fue lo que cambió.

A veces un patrón de ruido nuevo es justo lo que quieres, por ejemplo cuando retiras una identidad de prueba y empiezas otra. Cambia la semilla a propósito, actualiza el registro en el mismo paso y conserva la entrada anterior con su número de versión. La semilla antigua sigue siendo una descripción válida de lo que esa versión produjo para ese perfil.

Este tipo de verificación responde a una pregunta acotada: ¿repite su ruido esta versión, con este perfil y esta semilla? No te dice cómo reacciona un sitio concreto a la huella. Mantén separadas esas dos preguntas en tus notas.

Límites que conviene planificar

La reproducibilidad se limita a la misma versión de BotBrowser, el mismo perfil y el mismo valor de --bot-noise-seed. El algoritmo de ruido puede cambiar entre versiones mayores, así que una semilla que coincidía en una versión mayor debe verificarse de nuevo tras actualizar. Una máquina distinta, un sistema operativo de destino distinto o argumentos de lanzamiento distintos también pueden cambiar los resultados. Trata una coincidencia entre máquinas o entre versiones como algo que se confirma con la rutina anterior y no como algo que se da por hecho.

Una huella estable también implica un compromiso. Presentar la misma salida en cada visita es lo que hace funcionar la continuidad de sesión, y es la misma propiedad que permite reconocer las visitas repetidas como repetidas. Si quieres que sesiones separadas lleven patrones de ruido sin relación, dales semillas distintas, y recuerda que el patrón de ruido es solo una de las señales que un servicio puede ver. Una semilla no hace que una huella sea imposible de vincular, y nada de lo aquí expuesto afirma cómo responderá un sitio concreto.

También conviene ser preciso sobre lo que te permite decir una verificación superada. Te permite decir que una versión, un perfil y una semilla repitieron la misma salida de Canvas, WebGL, Audio y métricas de texto en una máquina dada, y que una semilla distinta la cambió. No te permite decir que el mismo resultado se mantendrá en todas las máquinas, tras cada actualización o en todas las páginas. Escribe los resultados en la primera forma y el registro seguirá siendo exacto cuando alguien lo lea meses después.

La semilla 0 merece una mención final porque es fácil de elegir por accidente. Mantiene el ruido activo con los valores por defecto del perfil, algo útil cuando quieres variación, pero no es una configuración determinista. Si tu verificación muestra que la salida cambia entre lanzamientos, comprueba primero que la semilla de la línea de comandos es un entero positivo y que tu lanzador o framework la está transmitiendo.

BotBrowser soporta --bot-noise-seed (ENT Tier2), un entero de 1 a 4294967295 que siembra el ruido de Canvas, WebGL, Audio y métricas de texto, de modo que el mismo perfil y la misma semilla repiten la misma huella en una prueba de continuidad de sesión o de verificación, mientras que una semilla distinta da una identidad estable y distinta. BotBrowser no puede garantizar una salida idéntica entre versiones, perfiles o argumentos de lanzamiento distintos, no puede hacer que una huella sea imposible de vincular ni que un sitio la acepte, y no sustituye la gestión del almacenamiento y las cookies, las decisiones de proxy e IP ni las comprobaciones propias del sitio.

Para conocer mejor las superficies implicadas, consulta Qué es la huella digital del navegador, Huella de Canvas, Protección de la huella de audio y el resumen más breve de reproducibilidad de la semilla de ruido.

Fuentes

Conclusión práctica

Conserva el perfil, la semilla positiva, la compilación y todos los argumentos en cada registro. Repite la fixture después de cambiar compilación, perfil, máquina o argumentos, y describe el resultado solo para ese contexto declarado.

#Deterministic#Noise-Seed#Reproducibility#fingerprinting#privacidad

Este artículo forma parte de la guía: ¿Qué es la huella digital del navegador?

Lleva BotBrowser de la investigación a producción

Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.