Semilla de ruido: RNG deterministico para huellas
Análisis profundo de cómo las semillas de ruido determinísticas producen huellas digitales de Canvas, WebGL y Audio consistentes entre sesiones y pipelines CI/CD.
Prefieres la documentación del producto mantenida?
Este artículo tiene una página equivalente en el centro de documentación. Usa los docs para el flujo canónico, las flags actuales y la referencia duradera.
Introducción
La protección de huellas digitales del navegador a menudo depende de añadir ruido a las salidas de renderizado: variaciones ligeras en los píxeles de Canvas, resultados del procesamiento de audio o datos de renderizado WebGL. Este ruido impide que se capture la huella digital original específica del dispositivo. Sin embargo, si ese ruido es aleatorio, la huella digital cambia en cada carga de página, cada sesión y cada reinicio del navegador. Una huella digital que cambia es en sí una señal distintiva, porque los dispositivos reales producen salidas estables y consistentes.
BotBrowser resuelve esto con el flag --bot-noise-seed. En lugar de aplicar ruido aleatorio, BotBrowser utiliza un generador de números aleatorios determinístico (RNG) con un valor proporcionado por el usuario como semilla. La misma semilla siempre produce el mismo patrón de ruido, lo que significa que se genera la misma huella digital cada vez. Esto hace que la salida de la huella sea estable entre sesiones, reproducible entre máquinas y predecible para pruebas, todo mientras sigue siendo diferente de la salida original del dispositivo.
Impacto en la privacidad
La distinción entre ruido aleatorio y determinístico tiene implicaciones significativas de privacidad.
El ruido aleatorio crea una nueva identidad de huella digital en cada sesión. Desde la perspectiva de un rastreador, una huella digital que cambia con cada visita es sospechosa. Los navegadores reales producen huellas digitales estables. Un usuario cuyo hash de Canvas cambia en cada carga de página destaca entre la gran mayoría de visitantes cuyo hash de Canvas permanece constante durante semanas o meses. Esta inestabilidad puede activar un escrutinio adicional y técnicas de rastreo más agresivas.
El ruido determinístico, por el contrario, produce una huella digital estable que se comporta exactamente como un dispositivo real. El hash de Canvas es consistente entre cargas de página. La huella de Audio es la misma hoy que ayer. La salida de WebGL permanece estable entre reinicios del navegador. Desde la perspectiva de cualquier script de fingerprinting, el navegador parece ser un dispositivo normal con una huella digital normal e inmutable.
Esta estabilidad es esencial para varios casos de uso:
- Consistencia multisesión: regresar a un sitio web con la misma huella digital parece natural. Llegar con una huella diferente cada vez sugiere herramientas de privacidad.
- Gestión de cuentas: al gestionar múltiples cuentas, cada una necesita su propia identidad estable. Un noise seed por cuenta asegura que cada identidad tenga una huella digital consistente y distinta.
- Pruebas y QA: las pruebas automatizadas que verifican comportamiento dependiente de huellas digitales necesitan resultados reproducibles. El ruido aleatorio hace las pruebas poco fiables; el ruido determinístico las hace confiables.
- Investigación: los investigadores de privacidad que estudian fingerprinting necesitan condiciones controladas. Un noise seed fijo permite la reproducción exacta de condiciones experimentales.
Contexto técnico
Cómo funciona el RNG determinístico
Un generador de números aleatorios determinístico (también llamado generador de números pseudoaleatorios, o PRNG) produce una secuencia de números que parece aleatoria pero está completamente determinada por su estado inicial, la semilla. Dada la misma semilla, el PRNG siempre produce exactamente la misma secuencia de números, en el mismo orden, independientemente de cuándo o dónde se ejecute.
BotBrowser usa un PRNG de calidad criptográfica inicializado con el valor proporcionado a través de --bot-noise-seed. Cuando el renderizado de Canvas necesita perturbación de ruido, obtiene valores de este PRNG. Cuando el procesamiento de Audio necesita variación, obtiene del mismo PRNG (o uno derivado). Cuando la salida de WebGL necesita modificación, la misma fuente determinística proporciona los valores.
Las propiedades clave son:
- Determinismo: la misma semilla produce la misma salida, siempre
- Independencia: semillas diferentes producen salidas completamente no relacionadas
- Uniformidad: la distribución del ruido parece natural, no con patrones
- Consistencia multiplataforma: la misma semilla produce la misma salida en cualquier SO anfitrión
Qué se inicializa con la semilla
El noise seed controla todas las variaciones relacionadas con el renderizado en BotBrowser:
- Canvas 2D: perturbaciones a nivel de píxel en la salida de renderizado de Canvas. Cuando una página llama a
canvas.toDataURL()ocanvas.getImageData(), los datos devueltos incluyen ruido derivado de la semilla. - WebGL: salida de shaders, datos de lectura y variaciones específicas del renderer están determinados por la semilla.
- Audio: el procesamiento de AudioContext (salida del oscilador, datos del analizador, comportamiento del compresor dinámico) incluye variación determinada por la semilla.
- Fuentes: micro-variaciones en la medición de glifos están inicializadas con la semilla, asegurando resultados consistentes de
measureText().
Cada uno de estos subsistemas usa una porción del flujo de salida del PRNG, asegurando que el ruido aplicado a Canvas no interfiera con el ruido aplicado a Audio, mientras ambos permanecen determinísticos para el mismo valor de semilla.
Espacio de semillas y colisiones
El noise seed es un valor entero. Diferentes valores enteros producen salidas de huella digital completamente diferentes. No hay relación predecible entre valores de semilla adyacentes (la semilla 42 y la semilla 43 producen huellas completamente no relacionadas). El espacio de huellas posibles es lo suficientemente grande como para que las colisiones accidentales (dos usuarios eligiendo coincidentemente la misma semilla) sean despreciables en la práctica.
Interacción con perfiles
El noise seed funciona en conjunto con, no como reemplazo del, perfil de huella digital. El perfil define las características del dispositivo: resolución de pantalla, modelo de GPU, plataforma, versión del navegador, fuentes y todas las demás señales de hardware/software. El noise seed controla la variación de renderizado dentro de la identidad del dispositivo de ese perfil.
Piénsalo de esta manera: el perfil define qué tipo de dispositivo se está presentando, y el noise seed determina las características específicas de renderizado de esa "instancia" particular del dispositivo. Dos instancias con el mismo perfil pero diferentes seeds parecen dos dispositivos físicos diferentes del mismo modelo. Dos instancias con el mismo perfil y la misma seed parecen el mismo dispositivo.
Enfoques de protección comunes y sus limitaciones
Ruido aleatorio (sin semilla)
Las herramientas que añaden ruido aleatorio a la salida de Canvas, WebGL y Audio crean una huella digital diferente cada vez que se inicia el navegador. Los problemas:
- La inestabilidad de la huella activa la sospecha de los rastreadores
- Las pruebas automatizadas no pueden depender de salidas consistentes
- La continuidad de sesión es imposible (cada visita parece un dispositivo nuevo)
- El análisis estadístico del patrón de ruido puede revelar su origen artificial
Salida sintética fija
Algunas herramientas reemplazan la salida de Canvas o Audio con un único valor codificado. Esto produce estabilidad pero tiene sus propios problemas:
- Todos los usuarios de la herramienta producen la misma huella, creando un grupo detectable
- La salida fija puede no coincidir con otras señales del dispositivo (GPU, fuentes, SO)
- Si los datos codificados son descubiertos, todos los usuarios son inmediatamente identificables
Ruido basado en extensiones
Las extensiones de navegador que inyectan ruido enfrentan las limitaciones discutidas en otros artículos: operan a nivel de API JavaScript, pueden detectarse a través de verificaciones de descriptores de propiedades, y no pueden controlar todas las rutas de renderizado consistentemente.
Sin ruido (solo perfil)
Usar un perfil sin ningún ruido produce salida determinada por el pipeline de renderizado del hardware anfitrión. Si bien el perfil controla los valores reportados, el renderizado real todavía refleja las características de GPU y fuentes del anfitrión. Añadir ruido con semilla asegura que la salida de renderizado sea controlada en lugar de filtrada del anfitrión.
Enfoque a nivel del motor de BotBrowser
El flag --bot-noise-seed
El flag --bot-noise-seed de BotBrowser acepta un valor entero que inicializa todo el ruido relacionado con el renderizado:
chrome --bot-profile="/path/to/profile.enc" \
--bot-noise-seed=42 \
--user-data-dir="$(mktemp -d)"
Con esta configuración:
- Canvas
toDataURL()ygetImageData()devuelven los mismos datos cada vez - Las operaciones de lectura de WebGL producen resultados idénticos entre sesiones
- El procesamiento de Audio (via AudioContext) genera los mismos datos de forma de onda
- Las métricas de fuentes son consistentes entre reinicios del navegador
- El hash de huella digital (hash de Canvas, Audio, WebGL) es estable
Control de ruido de Canvas
BotBrowser proporciona control granular sobre el ruido de Canvas a través de --bot-config-noise-canvas:
# Habilitar ruido de Canvas con semilla determinística
chrome --bot-profile="/path/to/profile.enc" \
--bot-noise-seed=42 \
--bot-config-noise-canvas=true
# Deshabilitar ruido de Canvas específicamente
chrome --bot-profile="/path/to/profile.enc" \
--bot-noise-seed=42 \
--bot-config-noise-canvas=false
Cuando el ruido de Canvas está habilitado, la semilla controla la perturbación exacta. Cuando está deshabilitado, la salida de Canvas se determina completamente por el perfil y el motor de renderizado sin ruido adicional.
Gestión de múltiples identidades
Para gestionar múltiples identidades distintas, asigna un noise seed único a cada una:
# Identidad A: huella consistente para Cuenta A
chrome --bot-profile="/profiles/profile-a.enc" \
--bot-noise-seed=1001 \
--user-data-dir="/data/account-a"
# Identidad B: huella diferente pero igualmente consistente
chrome --bot-profile="/profiles/profile-b.enc" \
--bot-noise-seed=2002 \
--user-data-dir="/data/account-b"
# Identidad C: tercera identidad distinta
chrome --bot-profile="/profiles/profile-c.enc" \
--bot-noise-seed=3003 \
--user-data-dir="/data/account-c"
Cada identidad tiene su propio perfil (que define las características del dispositivo) y su propio noise seed (que define las variaciones de renderizado). Las huellas digitales son distintas entre sí y estables entre sesiones.
Reproducibilidad entre máquinas
Una de las propiedades más poderosas del ruido determinístico es la reproducibilidad entre máquinas. El mismo perfil y semilla producen la misma huella digital en cualquier máquina anfitriona, independientemente de:
- Sistema operativo del anfitrión (Windows, macOS, Linux)
- Modelo de GPU del anfitrión
- Conjunto de fuentes del anfitrión
- Resolución de pantalla del anfitrión
- Contenedor Docker vs. bare metal vs. máquina virtual
Esto hace que --bot-noise-seed sea esencial para despliegues distribuidos donde múltiples máquinas necesitan presentar la misma identidad, o donde un pipeline CI/CD necesita reproducir las condiciones exactas de huella digital de un entorno de producción.
Configuración y uso
Uso básico de CLI
# Huella determinística con semilla
chrome --bot-profile="/path/to/profile.enc" \
--bot-noise-seed=42 \
--user-data-dir="$(mktemp -d)"
Ejemplo de pipeline CI/CD
# Mismo perfil y semilla en CI produce la misma huella que producción
chrome --bot-profile="/profiles/production-identity.enc" \
--bot-noise-seed=98765 \
--bot-time-scale=1.0 \
--bot-fps=60 \
--headless \
--user-data-dir="$(mktemp -d)"
Integración con Playwright
const { chromium } = require('playwright-core');
(async () => {
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--bot-noise-seed=42',
],
headless: true,
});
const context = await browser.newContext({ viewport: null });
const page = await context.newPage();
// El hash de Canvas será el mismo en cada ejecución
const canvasHash = await page.evaluate(() => {
const c = document.createElement('canvas');
c.width = 200;
c.height = 50;
const ctx = c.getContext('2d');
ctx.textBaseline = 'top';
ctx.font = '14px Arial';
ctx.fillStyle = '#333';
ctx.fillText('Deterministic test', 2, 2);
ctx.fillStyle = 'rgba(0, 50, 255, 0.5)';
ctx.fillRect(50, 10, 100, 30);
return c.toDataURL();
});
console.log('Canvas hash:', canvasHash.substring(0, 80) + '...');
await browser.close();
})();
Integración con Puppeteer
const puppeteer = require('puppeteer-core');
(async () => {
const browser = await puppeteer.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--bot-noise-seed=42',
'--bot-config-noise-canvas=true',
],
headless: true,
defaultViewport: null,
});
const page = await browser.newPage();
await page.goto('about:blank');
// La huella de audio también será determinística
const audioHash = await page.evaluate(() => {
return new Promise(resolve => {
const ctx = new OfflineAudioContext(1, 44100, 44100);
const osc = ctx.createOscillator();
osc.type = 'triangle';
osc.frequency.value = 10000;
osc.connect(ctx.destination);
osc.start(0);
ctx.startRendering().then(buffer => {
const data = buffer.getChannelData(0).slice(4500, 5000);
const sum = data.reduce((a, b) => a + Math.abs(b), 0);
resolve(sum.toFixed(10));
});
});
});
console.log('Audio hash:', audioHash);
await browser.close();
})();
Configuración determinística completa
Para máxima reproducibilidad, combina el noise seed con control de temporización y tasa de cuadros:
chrome --bot-profile="/path/to/profile.enc" \
--bot-noise-seed=42 \
--bot-time-scale=1.0 \
--bot-fps=60 \
--bot-config-noise-canvas=true \
--user-data-dir="$(mktemp -d)"
Verificación
Para verificar el comportamiento determinístico, ejecuta la misma configuración dos veces y compara:
// Ejecución 1: capturar hashes de huella digital
const run1Canvas = await page.evaluate(() => {
const c = document.createElement('canvas');
c.width = 200; c.height = 50;
const ctx = c.getContext('2d');
ctx.font = '14px Arial';
ctx.fillText('Test string', 10, 25);
return c.toDataURL();
});
// Ejecución 2: mismo perfil, misma semilla, debería producir hash idéntico
// (reiniciar navegador entre ejecuciones)
const run2Canvas = await page.evaluate(() => {
const c = document.createElement('canvas');
c.width = 200; c.height = 50;
const ctx = c.getContext('2d');
ctx.font = '14px Arial';
ctx.fillText('Test string', 10, 25);
return c.toDataURL();
});
console.log('Canvas match:', run1Canvas === run2Canvas);
// Debería imprimir: Canvas match: true
Qué verificar:
- La salida de Canvas es idéntica entre reinicios del navegador con la misma semilla
- El procesamiento de Audio produce los mismos valores de hash entre sesiones
- Los datos de lectura de WebGL coinciden entre ejecuciones
- Semillas diferentes producen salidas diferentes (pero individualmente estables)
- La misma semilla en diferentes máquinas anfitrionas produce la misma huella
- Las herramientas de prueba de fingerprinting (CreepJS, BrowserLeaks) muestran hashes estables
Mejores prácticas
-
Elige semillas únicas por identidad. Cada identidad del navegador debería tener su propio noise seed. Usar la misma semilla para múltiples identidades hace que produzcan la misma salida de renderizado, lo que puede vincularlas.
-
Almacena las semillas de forma segura. El noise seed es parte de la configuración de identidad. Trátalo como dato sensible junto con la ruta del perfil y el directorio de datos de usuario.
-
Usa semillas en CI/CD. Para pruebas automatizadas, siempre especifica un noise seed para asegurar resultados determinísticos. Sin semilla, la salida de renderizado puede variar entre ejecuciones de prueba.
-
Combina con
--bot-time-scale. Para determinismo completo, controla tanto el ruido de renderizado como las señales de temporización. El noise seed maneja Canvas/Audio/WebGL, mientras que--bot-time-scalemaneja la temporización de rendimiento. -
Documenta las asignaciones de semillas. En despliegues multiidentidad, mantén un mapeo de qué semilla está asignada a qué identidad. Esto asegura que puedas reproducir la huella exacta de cualquier identidad.
-
Evita semillas secuenciales para identidades relacionadas. Aunque las semillas secuenciales (1, 2, 3) producen salidas no relacionadas, usar un mapeo deliberado (como hashear identificadores de cuenta) proporciona mejor claridad organizativa.
Preguntas frecuentes
¿El noise seed afecta el contenido de la página o la calidad de renderizado?
No. El ruido se aplica a nivel de sub-píxel para Canvas y con precisión similar para Audio y WebGL. Las variaciones son invisibles al ojo humano e inaudibles. Las páginas se ven y funcionan de forma idéntica independientemente del valor de la semilla.
¿Dos usuarios con la misma semilla pueden ser vinculados?
Si dos usuarios usan el mismo perfil Y la misma semilla, su salida de renderizado será idéntica, lo que teóricamente podría vincularlos. Por eso cada identidad debería usar una semilla única. Perfiles diferentes con la misma semilla producen salidas diferentes porque el perfil también influye en el renderizado.
¿Qué pasa sin --bot-noise-seed?
Sin noise seed, BotBrowser sigue aplicando las características del dispositivo del perfil, pero el ruido de renderizado (si está habilitado) puede usar una semilla aleatoria de sesión. Esto proporciona una salida diferente a la del anfitrión pero no garantiza consistencia entre sesiones. Para huellas estables, siempre especifica un noise seed.
¿La semilla necesita ser un tipo específico de número?
La semilla es un entero. Cualquier valor entero funciona. No hay ventaja en elegir números grandes, números primos o cualquier otro patrón específico. Simplemente usa un valor que sea único por identidad.
¿Puedo cambiar la semilla para obtener una nueva huella digital?
Sí. Cambiar el noise seed manteniendo el mismo perfil produce una nueva huella distinta. Esto es útil cuando necesitas rotar identidades mientras mantienes la misma clase de dispositivo (mismo perfil, diferentes características de renderizado).
¿Cómo interactúa --bot-noise-seed con --bot-config-noise-canvas?
--bot-config-noise-canvas activa o desactiva si se aplica ruido de Canvas. --bot-noise-seed controla el patrón de ruido cuando se aplica. Si el ruido de Canvas está deshabilitado, la semilla sigue afectando el ruido de Audio y WebGL. Si el ruido de Canvas está habilitado, la semilla lo hace determinístico.
¿El noise seed es compatible con todos los perfiles?
Sí. El noise seed es independiente de la configuración del dispositivo del perfil. Cualquier semilla funciona con cualquier perfil. La semilla controla la variación de renderizado, mientras que el perfil controla la identidad del dispositivo.
¿Los servicios de fingerprinting pueden detectar que el ruido es determinístico?
No. El patrón de ruido producido por una semilla determinística es estadísticamente indistinguible de la variación natural del hardware. El determinismo solo es observable si la misma semilla se prueba múltiples veces y se confirma la misma salida exacta, que es el comportamiento pretendido (estabilidad, no aleatoriedad).
Resumen
El flag --bot-noise-seed es la base de la protección de huella digital reproducible en BotBrowser. Al inicializar un RNG determinístico que controla las variaciones de renderizado de Canvas, WebGL, Audio y fuentes, produce huellas digitales que son estables entre sesiones, reproducibles entre máquinas e indistinguibles de la salida natural del dispositivo. Combinado con la gestión de perfiles, protección de Canvas, control de huella de Audio y temporización de rendimiento, la reproducibilidad con noise seed permite identidades de huella digital consistentes y predecibles para protección de privacidad, gestión multicuenta, pruebas e investigación.
Artículos Relacionados
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.