Privacy herramientas
Qué averigua realmente un sitio a partir de tu IP pública, tus encabezados de petición y el hardware que JavaScript puede leer, y cómo censurar archivos HAR, URL y tokens antes de compartirlos.
3 herramientas
Tres observadores, tres capas de datos
Cuando tu JavaScript se ejecuta, el sitio ya sabe bastante. La capa de transporte le ha entregado la dirección IP pública por la que has salido, y de esa dirección sola: el ASN que anuncia el prefijo, una estimación geográfica gruesa, la versión HTTP negociada y la versión TLS que ofreció tu cliente. Nada de esto es opcional, nada implica una cookie, y todos los proxys inversos del camino registran la mayor parte por defecto. Ver IP muestra qué expone tu propia conexión: IP, ciudad, región, país, ISP, ASN, zona horaria, el PoP de borde que terminó la petición, el protocolo HTTP y TLS.
La segunda capa es lo que el navegador aporta por su cuenta en los encabezados de
petición: User-Agent, Accept-Language, Accept-Encoding, Referer y las pistas de
cliente Sec-CH-UA-*. Baratos de recopilar, registrados en todas partes y — a diferencia
de la capa de red — autodeclarados, así que también trivialmente falsificables. La
tercera capa es lo que el script mide después de la carga: screen.width y
devicePixelRatio, Intl.DateTimeFormat().resolvedOptions().timeZone,
navigator.hardwareConcurrency, navigator.deviceMemory, maxTouchPoints, más los
artefactos de renderizado de <canvas>, WebGL, AudioContext y el sondeo de
tipografías. Huella del Navegador lee esa capa localmente,
hasta una firma de renderizado de canvas.
El modelo mental que importa: ningún valor por separado tiene que ser secreto. Tu
zona horaria es información pública. La huella digital funciona sobre la distribución
conjunta: un valor compartido por un usuario de cada 2^k aporta k bits de entropía, y los
bits se acumulan, con unos 33 bits separando a una persona de 8.600 millones. Las señales
correlacionadas suman menos que la suma de sus partes (platform: MacIntel y un agente
de usuario Macintosh son casi el mismo bit), así que las cifras publicadas por atributo
nunca se suman sin más. Panopticlick midió unos 10,0 bits para el User-Agent, 6,09 para
los encabezados Accept, 4,83 para la resolución de pantalla más la profundidad de color
y 3,04 para la zona horaria; los ~18,1 bits que tanto se citan eran la media de una
huella completa en ese estudio, dominada por la enumeración de plugins (15,4 bits) y de
tipografías (13,9 bits) que los navegadores modernos han cerrado en gran medida, y como
los valores de encabezados y de pantalla se solapan, no pueden combinarse por encima de
esa media de huella completa. Trabajos posteriores sobre una población mucho más amplia
(Gomez-Boix et al., 2 millones de huellas) encontraron los navegadores corrientes aún
menos únicos. La lección está en el mecanismo más que en una cifra objetivo: una docena
de atributos aburridos bastan para que quien vuelve siga siendo reconocible sin ninguna
cookie.
Dos consecuencias que la ingeniería entiende al revés: la dirección IP es el
identificador más duradero de la pila y una de las señales de ubicación más débiles; y la
entropía es simétrica, así que falsear un valor hacia algo inusual te vuelve más
identificable. Un User-Agent que dice ser un iPhone junto a una pantalla de 3440×1440,
16 núcleos de CPU y maxTouchPoints: 0 es una huella de un solo ejemplar.
Referencia de señales
| Señal | Observador | Entropía aprox. | Estabilidad |
|---|---|---|---|
| IP pública | Red, antes del JS | Alta, compartida con los pares detrás del NAT | Cambia según la red / la VPN |
| ASN + organización | Red, antes del JS | ~5–10 bits | Estable por ISP |
Accept-Language | Encabezado de petición | ~5–8 bits | Muy estable |
User-Agent, Sec-CH-UA-* | Encabezado + JS | ~10 bits, decreciendo | Estable hasta que se actualiza el navegador |
| Zona horaria | JS | ~3–5 bits (~400 zonas IANA) | Viaja contigo, no con la IP |
Pantalla + devicePixelRatio | JS | ~5–8 bits | Cambia al conectar un monitor |
Núcleos de CPU (hardwareConcurrency) | JS | ~2–3 bits | Fijo por máquina; un recuento en bruto, sin agrupar (6, 10, 12 y 20 son todos habituales) |
Memoria del dispositivo (deviceMemory) | JS | ~1–2 bits | Fija; agrupada en 0,25/0,5/1/2/4/8 GB y limitada a 8 |
| Renderizado de canvas | JS | ~8 bits | Muy estable por GPU + controlador |
| Cadena del renderizador WebGL | JS | ~10 bits o más | Muy estable |
| Enumeración de tipografías | JS | Alta en escritorio | Estable por instalación |
Identificador en cookie / localStorage | Asignado por el servidor | Único por diseño | Hasta que el usuario lo borra |
Las cifras son estimaciones de orden de magnitud tomadas de estudios de población publicados, no una medición de tu navegador: una señal vale más bits en una población diversa y menos en una homogénea. Fíjate en que la última fila es el único identificador que un usuario puede borrar; todo lo que está por encima se regenera en la siguiente visita.
Qué se va con el artefacto
La mayoría de las filtraciones reales no son rastreo. Son un artefacto de depuración pegado en un ticket.
| Artefacto | Qué obtiene quien lo recibe | Campos que lo llevan |
|---|---|---|
| Exportación HAR | Una sesión funcional, más todos los cuerpos de respuesta que esa pestaña pudiera leer | Cookie, Set-Cookie, Authorization, x-api-key, ?token=, postData.text, content.text |
| Una URL en un ticket | La identidad de la cuenta y un acceso que sigue funcionando hasta que caduca | ?session=, ?sig=, X-Amz-Signature, parámetros de seguimiento con un correo hasheado |
| Un JWT en un informe de error | Quién es el usuario y qué puede hacer, sin necesitar ninguna clave para leerlo | sub, email, tenant, roles, exp |
Encabezados de correo en bruto, .eml | La ruta real del remitente y tu topología interna | Received: (host from, IP de origen), X-Originating-IP, nombres de host internos en by |
| Una línea de registro en un ticket | La IP real del usuario junto al modelo del dispositivo y la versión del sistema | X-Forwarded-For, remote_addr, tokens de modelo del User-Agent (SM-G991B, Build/…) |
| Captura de pantalla de DevTools | Lo que hubiera en el panel abierto, en píxeles que ningún escáner de secretos detectará | Network → cuerpo de la respuesta, Application → columna Value de las cookies |
Qué herramienta para cada pregunta
«¿En qué dirección estoy ahora mismo?» es la única pregunta que no se puede responder
localmente: solo un punto remoto ve la dirección por la que sales, y por eso
Ver IP consulta api.sitekits.dev (metadatos devueltos como eco, nada
almacenado). ifconfig te da una dirección de red local, no la que necesita la lista de
permitidos de tu cortafuegos. «¿Qué puede leer un script sobre esta máquina?» es el caso
opuesto, completamente local: Huella del Navegador cubre las
filas de encabezados, pantalla y hardware más una firma de canvas truncada, pero no
enumera tipografías, WebGL ni audio: tómala como una ayuda de inspección, no como una
puntuación de unicidad. Recurre en cambio al
Parseador UserAgent cuando tengas una cadena UA de un registro
y ningún navegador en vivo.
Usa Cabeceras HTTP para auditar qué dice un origen sobre tu
privacidad: Referrer-Policy decide cuánta parte de la URL se reenvía a terceros, y los
atributos de Set-Cookie deciden cuánto sobrevive un identificador asignado. La petición
sale del servidor, así que obtienes los encabezados en bruto del origen sin el ruido del
navegador: solo encabezados, nunca el cuerpo.
Para recorrer la tabla de arriba: pasa una exportación HAR por el
Sanitizador HAR antes de que salga de tu equipo — sustituye los
encabezados que coinciden, los tokens de la cadena de consulta y ambos cuerpos por
[REDACTED] e informa de cuántos valores ha tocado — y abre después la copia saneada en
el Visor HAR para confirmar que han sobrevivido los tiempos y los
códigos de estado que necesitabas; esa pareja se trata en la
guía de HAR. Despliega un enlace sospechoso con el
Parseador de URL antes de pegarlo, descodifica un token capturado con
el Decodificador JWT para ver exactamente qué reclamaciones estarías
reenviando, y pasa un bloque de encabezados en bruto por
Análisis de Encabezados para ver la cadena Received: que estás a
punto de publicar. Esas cuatro se ejecutan en la página y no suben nada. Una captura de
pantalla no tiene esa opción: recórtala, porque difuminar no es censurar. La higiene de
tokens en un sentido más amplio está en las
herramientas de seguridad y en
/es/for/security/.
Trampas
Tomar la geolocalización por una posición
El campo city indica dónde está registrado el prefijo. Los operadores móviles hacen
aterrizar regiones enteras en un solo registro, y un ASN de centro de datos que lleva una
ciudad de aspecto residencial es una contradicción que conviene investigar antes que
creer.
Censurar solo los campos que ves
La censura basada en patrones compara con una lista fija de nombres de encabezado y con
nombres de parámetro que contengan
token|key|secret|password|passwd|pwd|auth|session|sig|signature. Un secreto en un
segmento de ruta de una URL (/v1/reset/9f3a…) o con un nombre propio de la casa se
pasa por alto. Repasa la salida saneada antes de adjuntarla.
Olvidar que la propia URL es un dato
Las cadenas de consulta acaban en los encabezados Referer, en los registros de acceso
de los CDN, en el historial del navegador y en las canalizaciones de analítica. Por eso
las URL firmadas caducan, y por eso los datos personales nunca deberían ser un parámetro
de consulta. Analiza antes de pegar.
Suponer que un cliente HTTP del lado del navegador es neutral
El Probador REST API envía las peticiones desde tu navegador
directas a la URL que escribes, sin ningún servidor de sitekits en el camino. Bueno para
la privacidad, pero por eso mismo el destino ve tu IP real, tu User-Agent y cualquier
credencial que pegues en el cuadro de encabezados. Usa un token desechable cuando el
endpoint no sea tuyo.