Canvas fingerprinting más allá de lo básico: por qué dos Chromes idénticos renderizan píxeles distintos
Dos dispositivos con el mismo Chrome, SO y GPU aún renderizan píxeles de canvas distintos. Por qué el pipeline de renderizado no es determinista, por qué la inyección de ruido de privacidad se vuelve en contra y dónde encaja el canvas hoy.
El canvas fingerprinting está en uso en producción desde 2012. La idea es sencilla: pedir al navegador que renderice contenido 2D, leer los píxeles resultantes y calcular su hash. Dispositivos distintos producen píxeles ligeramente distintos para las mismas instrucciones, y esas diferencias son lo bastante estables como para identificar un dispositivo entre sesiones.
Hasta ahí, todo es conocido. Lo que se entiende menos es por qué funciona la técnica: por qué configuraciones de software idénticas sobre hardware idéntico siguen produciendo salidas de píxeles diferentes. La respuesta está en la intersección de los drivers de GPU, el renderizado de fuentes y la aritmética de coma flotante.
El pipeline de renderizado no es determinista
Cuando JavaScript llama a context.fillText("Cwm fjord bank glyphs vext quiz", 4, 45), Chrome no renderiza los píxeles por sí mismo. Genera instrucciones para Skia —la librería de gráficos 2D—, que a su vez emite comandos de dibujo a un backend acelerado por GPU (normalmente ANGLE en Windows, Metal en macOS o un fallback por software en contenedores).
En cada paso se acumulan pequeñas diferencias de implementación:
-
El subsistema de fuentes de Skia selecciona una familia tipográfica. Si Arial no está instalada, recurre a una alternativa, y esa alternativa varía según las fuentes instaladas en el sistema.
-
La fuente seleccionada se renderiza al tamaño solicitado usando FreeType (en Linux), DirectWrite (en Windows) o Core Text (en macOS). Cada librería tiene algoritmos de hinting diferentes.
-
Se aplica el posicionamiento subpíxel. Aquí es donde fuentes idénticas empiezan a producir píxeles distintos: el algoritmo redondea las posiciones a desplazamientos fraccionarios de píxel, y las reglas de redondeo difieren entre plataformas.
-
El texto rasterizado se compone sobre el canvas. La mezcla se realiza mediante shaders de GPU en sistemas con aceleración por hardware, y mediante código de CPU en modo fallback.
Cada uno de estos pasos puede introducir diferencias de uno o dos valores de píxel. Invisibles por separado. Únicas en conjunto.
Las versiones de los drivers de GPU dominan la huella
Dos máquinas con Windows 11 y chips Intel UHD Graphics 620 pueden producir salidas de canvas distintas si sus drivers de GPU difieren. Intel publica actualizaciones de drivers varias veces al año, y cada actualización puede cambiar el filtrado subpíxel, la corrección gamma y el anti-aliasing del texto.
Esto significa que la estabilidad de la huella de canvas está acotada por la frecuencia de actualización de los drivers. Un usuario que actualiza su driver gráfico —a menudo de forma silenciosa, vía Windows Update— verá cambiar su huella de canvas.
Los sistemas de detección lo gestionan tratando la huella de canvas como una señal entre muchas, no como un identificador autónomo. Cuando cambia pero las demás señales permanecen estables (huella de TLS, renderizador de WebGL, zona horaria, fuentes instaladas), el visitante sigue siendo reconocido.
El renderizado de emojis es una mina de oro
El elemento más identificativo de una huella de canvas a menudo no es el texto ni las formas, sino los emojis. Su renderizado depende de la fuente de emojis que incluye el sistema operativo: Segoe UI Emoji en Windows, Apple Color Emoji en macOS, Noto Color Emoji en Android.
Incluso dentro de un mismo SO, el renderizado de emojis cambia entre versiones. El renderizado del emoji de arcoíris en Windows 10 difiere del de Windows 11. La cara sonriente de iOS 16 tiene un anti-aliasing distinto al de iOS 17.
Los scripts modernos de canvas fingerprinting renderizan específicamente secuencias de emojis que incluyen las incorporaciones más recientes a Unicode. Un visitante que afirma usar Safari en iPhone pero no puede renderizar un emoji añadido en iOS 17 está ejecutando un iOS más antiguo, o miente sobre la plataforma.
Los frameworks de automatización producen huellas distintivas
Chrome headless, ejecutándose en un contenedor Docker sin GPU, usa SwiftShader para renderizar. SwiftShader produce salidas de canvas internamente consistentes pero distintas de las de cualquier Chrome con aceleración por hardware.
La firma es reconocible: un anti-aliasing inusualmente limpio, valores de color específicos en las regiones de degradado y bordes de texto que no coinciden con ningún driver de GPU conocido. Una huella de canvas que coincide con SwiftShader en Chrome 124 sobre un contenedor Linux es casi con total seguridad automatización: ningún usuario real ejecuta un navegador así.
Puppeteer-extra-stealth intenta falsear la salida del canvas interceptando toDataURL() y devolviendo datos modificados. Pero la modificación a menudo introduce sus propios artefactos: patrones de ruido que se repiten entre sesiones y que, paradójicamente, hacen que el esfuerzo anti-fingerprinting sea más detectable que no hacer nada.
Por qué la inyección de ruido no funciona bien
Los navegadores centrados en la privacidad, como Brave, inyectan ruido en la salida del canvas para impedir el rastreo. La idea es añadir pequeñas variaciones aleatorias a los valores de los píxeles para que el mismo dispositivo produzca huellas distintas en cada sesión.
En la práctica, la inyección de ruido tiene tres problemas:
1. El propio ruido es una huella. Un visitante cuya salida de canvas cambia en cada carga, pero cuyas demás señales permanecen idénticas, es reconocible como un navegador que inyecta ruido. Eso, en sí mismo, es identificativo.
2. El algoritmo de ruido es estable. La implementación de Brave produce patrones de ruido específicos que no coinciden con la varianza natural del renderizado por GPU. Los sistemas de detección pueden distinguir salidas de canvas que parecen inyectadas con ruido de las que parecen naturales.
3. Los sistemas sofisticados combinan muestras. Varios renderizados en la misma página, o entre sesiones, pueden promediarse. Si el ruido es pequeño, la media converge hacia la huella determinista subyacente.
Qué captura el canvas fingerprinting
Más allá de la salida visual evidente, el canvas fingerprinting puede extraer varios atributos del dispositivo como efectos secundarios:
Tiempo de renderizado: cuánto tarda el canvas en renderizarse revela la capacidad de la GPU. Un equipo de escritorio 4K con GPU dedicada renderiza más rápido que un portátil de gama media.
Métricas de texto: measureText() devuelve anchuras exactas en píxeles que varían según el renderizado de fuentes. La anchura del texto puede usarse como huella incluso sin renderizar nada.
Soporte de operaciones de composición: algunos navegadores o configuraciones de GPU admiten modos de composición extendidos. Comprobar ese soporte revela los límites de capacidad.
Efectos de filtro: los filtros al estilo CSS aplicados al canvas producen salidas distintas entre GPUs, especialmente los filtros de desenfoque y sombra proyectada.
Dónde encaja el canvas fingerprinting en un stack de detección
Por sí solo, el canvas fingerprinting no es un identificador robusto. Los drivers cambian. Los usuarios cambian de navegador. La inyección de ruido es común entre las audiencias preocupadas por la privacidad.
Su verdadera fortaleza es la validación cruzada. Cuando una sesión afirma ser un usuario recurrente basándose en cookies o en el login de la cuenta, la huella de canvas actúa como segunda señal: coincidir con la huella histórica confirma la afirmación; no coincidir marca un posible robo de cuenta o secuestro de sesión.
Para la detección de bots, el canvas fingerprinting sobresale atrapando la automatización en contenedores. Los usuarios reales tienen GPUs reales. Las GPUs reales producen firmas de renderizado reconocibles. Cualquier cosa que renderice como SwiftShader, o como un canvas mal falseado, cae en la categoría de «casi con total seguridad, un bot».
La técnica de 2012 sigue funcionando en 2026 por la misma razón: el renderizado es determinista por entorno pero casi imposible de falsear por completo. Cada intento de ocultarse deja rastros del propio intento.