Cómo una prueba de privacidad no guarda ningún dato
Una prueba de privacidad es una herramienta que te muestra lo que los sitios web pueden saber de tu navegador —señales de canvas y GPU, fuentes, pantalla, zona horaria, idioma, pistas de red y los identificadores silenciosos que permiten a un sitio reconocerte al volver— y eso crea un problema de credibilidad: una herramienta que demuestra técnicas de vigilancia es juzgada también por sus propias prácticas de datos, que no pueden ser una página de política añadida después. La regla de diseño detrás de nuestra prueba de huella del navegador se dice en una frase: si el navegador puede leerlo, el servidor nunca lo ve. Este artículo explica lo que cuesta esa regla, dónde se dobla y dónde se detiene. Si quieres primero el inventario de señales, empieza por lo que los sitios web saben de ti; este texto trata de la fontanería bajo la prueba, no de las señales.
Primero el cliente
Cada señal que el propio navegador ofrece se lee y se muestra localmente, en tu máquina, por el código de la página en tu pestaña. Renderizado de canvas, cadenas del renderizador WebGL, propiedades del contexto de audio, sondas de fuentes instaladas, geometría de pantalla y ventana, profundidad de color, soporte táctil, estimaciones de almacenamiento, consultas de medios sobre contraste y movimiento: todo se calcula donde se descubre y se dibuja en la página que ves. El código de la página es lo único que tiene alguna vez el panorama completo. Ningún script recoge el panel en una carga, ninguna baliza lo lleva a casa y ningún evento de analítica lo resume, porque en el momento en que una huella completa sale del navegador, la prueba se ha convertido en aquello contra lo que advierte.
Ese orden —local primero, servidor al final, y servidor solo para los pocos trabajos que un navegador de verdad no puede hacer solo— no es una característica de la arquitectura; es la arquitectura. La mayoría de las herramientas de privacidad se construyen al revés: recogen todo centralmente y luego prometen borrarlo, anonimizarlo o guardarlo poco tiempo. Esas promesas pueden cumplirse, pero son promesas, y un lector no puede auditar un borrado. Un diseño que nunca transmite los datos sustituye una promesa por un hecho sobre la ruta del código, y los hechos sobre rutas de código se pueden comprobar en una pestaña de red, que es exactamente el estándar que una herramienta de privacidad debería invitar.
El coste es real y se acepta por diseño. No hay nada entre dispositivos: ninguna cuenta que te siga, ningún historial que se sincronice, ninguna comparación con tu huella en otro portátil, porque todo eso exige que el servidor guarde algo por persona. Las comparaciones se limitan a lo que tu propio navegador recuerda localmente y a los contadores diarios anónimos descritos abajo. Cuando una función necesitaría la huella completa en el servidor, la respuesta no es una política de retención más cuidadosa: es no. La restricción es el producto.
Tres endpoints pequeños, tres trabajos distintos
Tres trabajos de verdad no pueden hacerse dentro de la página, y cada uno recibe su propio endpoint pequeño con su trabajo estrecho. El primero, /api/check/whoami, devuelve solo lo que cualquier servidor ya ve en la petición que trajo la página: tu dirección de red tal como llegó, las cabeceras que tu navegador envió con ella y la geografía aproximada ligada a esa dirección. Mostrarte esos valores no añade exposición nueva, porque cada servidor que visitas los recibe los muestre o no; el endpoint simplemente convierte una divulgación unidireccional en una visible, y no guarda nada más allá de la respuesta.
El segundo, /api/check/etag, existe solo para demostrar el reconocimiento basado en caché, explicado en la siguiente sección: entrega un identificador de caché aleatorio y no guarda nada en absoluto, ni una tabla de valores emitidos ni un registro de quién preguntó. El tercero es el endpoint de contadores: acepta un puñado de valores aproximados de una ejecución terminada y devuelve totales acumulados, para que la página pueda decir lo común que es tu configuración sin que nadie guarde tu visita. Cada endpoint tiene límite de velocidad como los demás comprobadores del sitio, porque pequeño y honesto no es lo mismo que ilimitado, y un endpoint de demostración que se puede martillear es una superficie de abuso con buena intención.
La página también es explícita sobre los servicios externos que contacta directamente desde tu navegador, porque esos servicios también ven tu dirección y la honestidad sobre ellos forma parte del diseño. La prueba lee endpoints de rastreo de Cloudflare, consulta un servicio de eco DNS para revelar qué resolutor responde por ti y abre conexiones a dos servidores STUN públicos para mostrar lo que una consulta estilo WebRTC puede aprender. Cada uno se nombra en la propia página, junto al resultado que produce: la misma disciplina de divulgación que aplicamos a las comprobaciones de fugas en fugas de VPN y comprobaciones de disfraz. Una prueba de privacidad que llamara en silencio a terceros suspendería su propia lección.
El truco del ETag, explicado con honestidad
Un ETag es una pieza ordinaria de la caché HTTP: un servidor adjunta un validador a una respuesta, el navegador lo guarda con la copia en caché y, en la siguiente visita, el navegador devuelve el validador para que el servidor pueda responder «no modificado» y ahorrar la transferencia. El truco es que el validador no tiene que describir el contenido. Un servidor puede emitir un validador único para cada visitante, y el navegador devolverá fielmente ese valor único en cada revalidación, momento en el que el servidor reconoce el navegador con la misma fiabilidad que con una cookie, sin haber puesto ninguna. La validación de caché funciona como identificador porque el navegador hace bien su trabajo.
Por eso borrar las cookies no lo borra: cookies y caché son almacenes separados, vaciados por controles separados y con calendarios separados. Y por eso una ventana privada o de incógnito rompe el truco: una ventana privada funciona con su propia caché separada, que se descarta al cerrarla, así que el validador muere con la sesión. Nuestro endpoint demuestra el viaje de ida y vuelta y no guarda nada: el reconocimiento lo prueba la propia respuesta 304, el servidor viendo volver su propio valor aleatorio, no ningún registro guardado entre visitas. La demostración termina en el momento en que se cierra la página, que es exactamente la propiedad que los rastreadores reales que usan esta técnica no ofrecen.
Hay un matiz honesto que vale la pena nombrar: la caché perimetral. Si las respuestas pasaran por una caché CDN compartida, el identificador del primer visitante podría servirse a todo el mundo, y la demostración mostraría una multitud compartiendo un ID en vez de cada navegador con el suyo. Por eso este endpoint renuncia por completo a la caché perimetral: cada petición llega al origen, cada visitante recibe un valor aleatorio nuevo y ninguna caché compartida guarda ninguno. Es una línea pequeña de configuración, pero es la diferencia entre una demostración que prueba el mecanismo y una que accidentalmente prueba lo contrario.
Contadores en vez de registros
Una pregunta sí necesita el servidor: «¿cuán inusual soy?» Una página que puede decir tu GPU apareció en N de M ejecuciones hoy enseña mucho más que una que solo lista señales, porque la rareza es lo que hace identificadora a una huella. Pero responderla de la manera obvia —registrar cada visita y luego contar— construye exactamente la base de datos contra la que la herramienta advierte. Así que la prueba guarda contadores en vez de registros: un número por valor y por día. El sistema operativo, la familia del navegador, la cadena de la GPU, la zona horaria, el primer idioma, la clase de tamaño de pantalla, los primeros ocho caracteres de los identificadores de huella, el resultado de cada comprobación individual y un tramo de duración: cada uno aporta una marca a un total diario, y no se guarda nada más.
Los límites importan más que el mecanismo. La huella completa nunca se envía, y mucho menos se guarda; tu dirección nunca se envía al contador. Un contador no puede consultarse al revés hasta llegar a una persona, porque no hay ninguna fila por visitante que encontrar: la agregación ocurre en el momento de contar, no después como un paso de informe sobre registros guardados. Es la misma razón por la que los totales se reinician por día: un contador que se acumulara para siempre, cortado lo bastante fino, se convertiría en silencio en una base de datos de huellas por acumulación, y el diseño rechaza esa deriva por adelantado en vez de pedir perdón después.
Dos decisiones más protegen a quienes nunca lean este artículo. Los navegadores que envían la señal Global Privacy Control nunca se cuentan: la señal significa «no me rastrees», y su lectura más respetuosa es excluir esas ejecuciones por completo en vez de contarlas con cuidado. Todos los demás tienen una opción visible de exclusión en la página, respetada antes de que ocurra cualquier conteo. Y una ejecución que no termina en 45 segundos cuenta una vez, como «atascada», en su propio tramo: la lentitud y los fallos siguen visibles para nosotros como operadores, como un único número agregado, sin seguir a ningún visitante individual a través de una ejecución fallida.
Lo que decidimos no construir
La parte más instructiva del diseño es la lista de cosas que quedaron fuera. No hay sonda a nivel de conexión: ni huella TLS ni lectura estilo JA3 de tu handshake. La razón honesta es arquitectónica: el TLS de este sitio termina en la CDN que está delante, así que una lectura del handshake tomada en nuestro origen describiría la negociación y los ajustes de la CDN mucho más que los de tu navegador. Publicarla como «tu huella TLS» sería teatro: un valor plausible con el nombre de otro. Una herramienta de privacidad que imprime una lectura segura pero equivocada enseña a sus usuarios a confiar en lecturas seguras pero equivocadas en todas partes, lo cual es peor que un panel vacío.
La misma disciplina dio forma al resto de omisiones. Los contadores son aproximados porque los contadores finos se convierten en una base de datos de huellas por acumulación, una dimensión inocente cada vez. La memoria de la última visita —«desde tu última ejecución, estos valores cambiaron»— vive solo en el almacenamiento de tu propio navegador, en tu máquina, y nunca se transmite; en el momento en que se sincronizara sería un historial, y un historial es un registro. Funciones que habrían sido de verdad útiles se cortaron por la misma razón por la que los endpoints se mantuvieron pequeños: la utilidad no es una defensa cuando el coste en datos es todo el sentido de la herramienta.
Por último, la nota de honestidad residual, porque ningún artículo de diseño debería terminar con sus propios elogios. Este diseño minimiza los datos; no puede hacer que las lecturas en sí sean menos identificadoras. Tu GPU, tus fuentes, tu pantalla y tu zona horaria se combinan en algo casi único se guarden o no: ese es el hallazgo que la herramienta existe para mostrarte. No guardar datos te protege de nosotros. No te protege de la técnica, y fingir lo contrario sería la única función de verdad deshonesta que podríamos entregar.