¿Qué es el fingerprinting del navegador?
El fingerprinting del navegador es una técnica de rastreo que identifica a los usuarios recogiendo información sobre la configuración de su navegador y su dispositivo. A diferencia de las cookies, que se guardan en tu equipo y se pueden borrar, un fingerprint se calcula a partir de datos que tu navegador expone por defecto -- información que existe porque las webs la necesitan para funcionar bien.
Tu navegador revela el sistema operativo, la resolución de pantalla, la zona horaria, el idioma, las fuentes instaladas, el modelo de GPU, las características del procesamiento de audio y mucho más. Por separado, ninguno de esos datos te identifica. Combinados, crean una firma que, con una probabilidad abrumadora, es única para tu navegador concreto en tu dispositivo concreto.
Un estudio de 2020 de investigadores de INRIA encontró que más del 94 % de los navegadores con JavaScript activado tenían un fingerprint único. Desde entonces la cosa solo se ha vuelto más precisa: las empresas de detección han añadido nuevas señales y mejorado sus algoritmos de hash.
Las señales del fingerprint
Hay más de 50 señales individuales que alimentan un fingerprint de navegador. Estas son las más importantes:
El navegador dibuja texto y formas invisibles en un elemento canvas de HTML5 y luego lee los datos de los píxeles. GPUs, controladores, motores de renderizado de fuentes y ajustes de suavizado del sistema operativo distintos producen resultados ligeramente diferentes -- suficiente para generar un hash casi único.
Parecido al canvas, pero con renderizado 3D. El navegador dibuja una escena 3D y el resultado varía según el hardware de la GPU, la versión del controlador y la implementación de OpenGL. También expone las cadenas de fabricante y renderizador de la GPU (por ejemplo, «ANGLE (NVIDIA GeForce RTX 3080)»).
El navegador genera una señal de audio con la Web Audio API y mide cómo se procesa. Hardware y controladores de audio distintos producen valores en coma flotante distintos, y de ahí sale un hash de audio único sin que suene nada.
El navegador mide el ancho y el alto del texto renderizado en varias fuentes. Comprobando qué fuentes están instaladas (y cómo se dibujan), un script de fingerprinting puede identificar tu conjunto concreto de fuentes -- que varía mucho de una máquina a otra.
Resolución de pantalla, espacio disponible (descontando la barra de tareas), profundidad de color, device pixel ratio, dimensiones interiores de la ventana y si está maximizada. La combinación de estos valores estrecha bastante la identificación.
Cadena del user agent, plataforma, idioma(s), número de núcleos de CPU (hardwareConcurrency), memoria del dispositivo, puntos de toque máximos, tipo de conexión y si «Do Not Track» está activado. Cada uno aporta unos pocos bits de entropía.
Más allá de estas señales principales, los scripts de fingerprinting también recogen:
- Zona horaria y configuración regional --
Intl.DateTimeFormat().resolvedOptions().timeZonerevela tu zona horaria exacta, y los ajustes regionales revelan preferencias de formato. - Enumeración de plugins y tipos MIME -- menos útil en navegadores modernos, pero se sigue consultando.
- Fuga de IP local por WebRTC -- WebRTC puede exponer direcciones IP de la red local incluso detrás de una VPN, y eso sirve como identificador adicional.
- Battery API -- en los navegadores que aún la soportan, el nivel exacto de batería y el estado de carga añaden entropía.
- Fingerprint de ClientRects -- medir con precisión los rectángulos de los elementos del DOM renderizados, que varían según el renderizado de fuentes y el motor de maquetación.
- Voces de síntesis de voz -- la lista de voces de texto a voz disponibles cambia según el sistema operativo y los paquetes de idioma instalados.
- Precisión matemática -- los resultados de
Math.tan(),Math.atan2()y otras funciones trigonométricas varían ligeramente entre arquitecturas de CPU y motores de JS.
Cómo se calcula un fingerprint
Un script de fingerprinting recoge todos estos valores, los serializa en una cadena o un objeto estructurado y los pasa por una función de hash (normalmente MurmurHash3 o SHA-256) para producir un identificador compacto. Un ejemplo simplificado:
const signals = {
canvas: getCanvasHash(),
webgl: getWebGLHash(),
audio: getAudioHash(),
fonts: getInstalledFonts(),
screen: `${screen.width}x${screen.height}x${screen.colorDepth}`,
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
language: navigator.language,
cores: navigator.hardwareConcurrency,
memory: navigator.deviceMemory,
platform: navigator.platform,
userAgent: navigator.userAgent,
touchPoints: navigator.maxTouchPoints,
// ... 30+ more signals
};
const fingerprint = murmurhash3(JSON.stringify(signals));
El hash resultante es una cadena corta -- algo como a3f8c91b -- que hace de ID único de tu navegador. Ese hash se guarda en el servidor y se compara con visitas posteriores.
Entropía: por qué unas señales pesan más que otras
No todas las señales aportan lo mismo a la unicidad. El concepto de entropía mide cuánta información identificativa lleva una señal. Más entropía significa más bits de información, es decir, una señal que acota más tu identidad.
| Señal | Entropía aproximada | Impacto en la unicidad |
|---|---|---|
| Hash del canvas | ~14 bits | Muy alto -- diferencias de GPU y de renderizado |
| Renderizador WebGL + hash | ~12 bits | Muy alto -- identifica el modelo de GPU |
| Fuentes instaladas | ~11 bits | Muy alto -- varía de una máquina a otra |
| Hash de AudioContext | ~10 bits | Alto -- depende del hardware |
| Resolución de pantalla | ~5 bits | Medio -- muchas resoluciones son comunes |
| Zona horaria | ~4 bits | Medio -- unos 24 grandes grupos horarios |
| User agent | ~6 bits | Medio -- la versión del navegador añade detalle |
| Idioma | ~3 bits | Bajo -- conjunto limitado de idiomas comunes |
| Plataforma | ~2 bits | Bajo -- Win/Mac/Linux/móvil |
| Profundidad de color | ~1 bit | Muy bajo -- casi todo el mundo va a 24 bits |
La entropía total de todas las señales de un script de fingerprinting moderno suele superar los 40 bits. Con 40 bits de entropía hay más de un billón de combinaciones posibles -- de sobra para identificar de forma única a cada navegador del planeta.
Fingerprinting activo y pasivo
Las técnicas de fingerprinting se dividen en dos categorías:
El fingerprinting pasivo usa los datos que el navegador manda automáticamente en cada petición HTTP: la cabecera del user agent, los idiomas aceptados, las codificaciones aceptadas y las características de la conexión. El servidor no necesita ejecutar JavaScript. Es más discreto pero da menos señales.
El fingerprinting activo ejecuta JavaScript en la página para sondear el navegador: renderiza imágenes en canvas, consulta WebGL, mide la salida de audio, enumera fuentes y comprueba comportamientos concretos de las APIs. Es mucho más potente y es en lo que se apoya la mayoría de sistemas de detección.
En la práctica, los sistemas de detección usan ambos. El fingerprint pasivo de las cabeceras HTTP se calcula en el servidor, mientras que el activo se calcula en el cliente con JavaScript y se envía de vuelta como señal. Los dos se combinan y se contrastan para ver si cuadran.
Cómo usan los fingerprints los sistemas de detección
Los fingerprints de navegador no se usan aislados. Las plataformas de detección modernas los combinan con otras señales para construir una puntuación de riesgo:
- Reputación de la IP -- ¿la dirección está asociada a un centro de datos, a una VPN o a una conexión residencial? ¿Ha aparecido en informes de abuso?
- Biometría del comportamiento -- patrones de movimiento del ratón, velocidad de desplazamiento, cadencia al teclear, tiempos de clic. Son notablemente constantes en cada persona y muy difíciles de imitar.
- Coherencia de la sesión -- ¿el fingerprint se mantiene estable entre cargas de página? Los navegadores legítimos tienen fingerprints estables. Los que cambian entre cargas se marcan como falseados.
- Coherencia entre señales -- ¿todas las señales del fingerprint cuentan la misma historia? Si el user agent dice «Chrome en Windows» pero el renderizador WebGL es una GPU que solo existe en macOS, el fingerprint no cuadra.
- Marcas de automatización -- ¿está puesto
navigator.webdriver? ¿Hay propiedades reveladoras dejadas por Selenium, Puppeteer o Playwright? ¿Se detectan las DevTools de Chrome?
El fingerprint por sí solo es apenas una entrada. Lo que de verdad importa es la coherencia y la verosimilitud de todo el paquete de señales. Un fingerprint perfecto con una IP de centro de datos y movimientos de ratón robóticos se marca igualmente.
Por qué no funcionan las herramientas de privacidad habituales
La gente suele recurrir a herramientas de privacidad que no sirven contra el fingerprinting:
Incógnito / navegación privada
El modo incógnito borra cookies e historial al cerrar la ventana. Al fingerprint no le hace nada. El hash del canvas, la salida WebGL, las fuentes, la resolución de pantalla y todas las demás señales siguen siendo idénticas a tu sesión normal. El mismo fingerprint, solo que sin cookies.
VPN / Tor
Las VPN cambian tu dirección IP. Tor además uniformiza algunas propiedades del navegador a través del Tor Browser. Pero las VPN corrientes no tocan el fingerprint del navegador -- el hash del canvas y el renderizador WebGL siguen igual. Y el Tor Browser, aunque resiste el fingerprinting, es reconocible como Tor Browser, algo que muchas plataformas bloquean de plano.
Extensiones del navegador
Extensiones como Canvas Blocker o los complementos de spoofing de fingerprint intentan interceptar las APIs de fingerprinting. El problema es triple: (1) las extensiones se detectan por sus efectos secundarios en el DOM y en el comportamiento de las APIs, (2) no pueden falsear de forma coherente las señales que nacen por debajo de la capa de JavaScript, y (3) la presencia de determinadas extensiones de privacidad es en sí misma una señal de fingerprint -- muy pocos usuarios reales las tienen instaladas.
Varios perfiles del navegador (Chrome/Firefox)
Chrome y Firefox permiten varios perfiles de usuario, cada uno con sus cookies y su historial. Pero todos comparten el mismo fingerprint, porque son el mismo navegador sobre el mismo hardware. Perfiles distintos, el mismo hash de canvas, el mismo WebGL, las mismas fuentes. Los sistemas de detección los relacionan al instante.
Cómo abordan el fingerprinting los navegadores antidetect
Los navegadores antidetect están hechos precisamente para atacar el fingerprinting en su origen. Esto es lo que hace distinto uno bien construido:
Configuración de fingerprint por perfil. Cada perfil de navegador recibe su propia configuración completa: una semilla concreta para el ruido del canvas, un renderizador WebGL falseado que corresponde a una GPU real, un conjunto de fuentes coherente con el sistema operativo elegido, métricas de pantalla propias de un dispositivo real, etcétera. La clave es que todos esos valores sean coherentes entre sí.
Modificación a nivel de motor. En un navegador antidetect bien hecho, las modificaciones del fingerprint ocurren dentro del motor del navegador -- en el nivel de C++ dentro de Chromium. Cuando una web llama a canvas.toDataURL(), es el propio motor el que devuelve datos de píxeles modificados. No hay ningún override de JavaScript que detectar, porque la modificación pasa antes de que los datos lleguen a la capa de JavaScript.
Inyección de ruido con semillas estables. En lugar de devolver valores aleatorios (que cambiarían en cada carga de página y harían saltar las alarmas), los buenos navegadores antidetect usan ruido determinista basado en una semilla por perfil. La misma prueba de canvas produce siempre el mismo hash dentro de un perfil, pero perfiles distintos dan hashes distintos. Así es como se comportan los navegadores reales: tu fingerprint es estable entre sesiones.
Validación de verosimilitud del hardware. Antes de generar un perfil, el sistema comprueba que la combinación de señales sea verosímil. Un perfil que dijera ser Windows 10 con una GPU Apple M2 resultaría sospechoso de inmediato. El generador de fingerprints se asegura de que sistema operativo, GPU, fuentes, user agent y demás señales formen una identidad coherente.
El objetivo no es hacer un navegador que parezca «anónimo». Es hacer uno que parezca una persona corriente usando un ordenador corriente -- solo que una persona corriente distinta en cada perfil.
La carrera armamentística
El fingerprinting del navegador es una carrera armamentística entre las empresas de detección y las herramientas antidetect, y va cada vez más rápido.
Los sistemas de detección son cada vez más sofisticados. Añaden señales nuevas (como mediciones de getClientRects() y el comportamiento de la WebCodecs API), cruzan biometría del comportamiento con datos del fingerprint y usan aprendizaje automático para detectar configuraciones «imposibles» o «improbables» que ningún navegador real produciría.
A la vez, los navegadores antidetect responden modificando capas más profundas del motor, mejorando las comprobaciones de coherencia y construyendo bases de datos más completas de configuraciones de dispositivos reales para usarlas como plantillas.
Dos cosas están claras: el fingerprinting no va a desaparecer (es demasiado valioso para la prevención del fraude y la segmentación publicitaria), y las herramientas pasivas como VPN y extensiones no bastan. Si el aislamiento a nivel de fingerprint importa en tu trabajo, necesitas una herramienta hecha justo para eso.