Browser Anti‑Fingerprinting
How to Blind Trackers and Feed Them False Data
When I first started digging into browser‑level anti‑fingerprinting, I quickly realized that the problem isn’t just “someone can see my user‑agent string.” It’s an entire ecosystem of tiny data points—canvas hashes, timing quirks, font lists, hardware concurrency, even the way my mouse wiggles across the page—that, when combined, can paint a surprisingly precise portrait of who I am. In this Article – “Browser Anti‑Fingerprinting: How to Blind Trackers and Feed Them False Data” I will help you to explore what we are up against and what technical ways there are to help.
At the high‑to‑critical threat level, these fingerprints become weaponized: trackers can stitch together cross‑site identities, advertisers can serve hyper‑targeted ads, and malicious actors can tailor phishing lures that look exactly like the sites you trust. In the worst‑case scenario, a persistent fingerprint can survive cookie wipes, VPN switches, and even private‑browsing sessions, effectively turning your browser into a digital passport that follows you everywhere.
So, what can we do?
- Blind the collector – strip away or randomize the signals before they ever leave your machine. This means disabling or “sandboxing” APIs that leak entropy (like Canvas, WebGL, AudioContext), normalizing timing sources, and feeding generic or deliberately noisy values for things like screen resolution, timezone, and language.
- Feed false data – actively inject misleading fingerprints that break the correlation logic used by trackers. By presenting a rotating set of plausible yet inconsistent attributes (e.g., a changing hardware concurrency count or a shuffled font list), you force the adversary to chase a moving target, dramatically raising the cost of building a reliable profile.
In the sections that follow I’ll walk through the most effective technical knobs you can turn—both built‑in browser settings and third‑party extensions—and show how to combine them into a layered defense that keeps your fingerprint from becoming a permanent badge of your online identity.
1. The Core Threat Model (High → Critical)
Threat level |
What the attacker gains | Why it matters for a fingerprint |
---|---|---|
High |
Ability to link visits across a handful of sites | Even a single stable identifier (e.g., canvas hash) lets trackers build a “profile seed.” |
Critical |
Persistent, cross‑device tracking that survives cookies, VPNs, and private windows | Combines many weak signals (fonts, hardware concurrency, battery status) into a highly unique vector. |
Both browsers expose roughly the same surface area, but each offers its own knobs for mitigation. The goal is to reduce entropy (make the fingerprint less unique) and/or inject noise (feed false data).
2. Baseline Hardening – Settings You Can Flip in One Click
Step | Action | Result |
---|---|---|
1️⃣ Enable “Network‑level DNS over TLS” | Settings → Network & internet → Private DNS → provider hostname (e.g., dns.quad9.net ) |
Prevents ISP‑level DNS fingerprinting. |
2️⃣ Activate “App‑specific VPN” (if you have Proton VPN or similar) | Settings → Network & internet → VPN → Add VPN → select Proton VPN → “Always-on” | Masks IP address and adds another layer of traffic obfuscation. |
3️⃣ Turn on “Incognito mode + Clear on exit” | Open GrapheneOS Browser → Tap three‑dot menu → New incognito tab → Settings → “Clear browsing data on close” | Guarantees no persistent storage of cookies or localStorage. |
4️⃣ Disable JavaScript for UnTrusted sites | Settings → Site settings → JavaScript → “Block on all sites” (then whitelist trusted domains) | Removes the biggest source of fingerprinting scripts. |
5️⃣ Reduce timer precision (requires a flag) | Open chrome://flags → Search “timer” → Enable #reduce-timer-precision → Relaunch |
Blurs micro‑timing side‑channels. |
6️⃣ Spoof User‑Agent (quick via URL) | Type
|
Hides device model and OS version. |
7️⃣ Install “CanvasBlocker” (or “Trace”) from Aurora Store | Search for the extension, install, enable “Maximum noise”. | Randomizes canvas, WebGL, audio, and hardware concurrency. |
8️⃣ Power‑save mode (optional) | Settings → Battery → Power‑save mode → On | Disables background sensors (e.g., motion, battery status) that can be queried via the Battery API. |
What a browser‑level fingerprint can “see”
Fingerprinting is basically a collection of tiny data points that, when combined, form a probabilistic identifier for a device or user.
Below is a practical inventory of everything a typical JavaScript‑based fingerprinting script can query (grouped by category).
1. Passive HTTP‑level clues (sent automatically with every request)
Item | Example value | Why it matters |
---|---|---|
IP address (public) | 203.0.113.42 |
Gives coarse geographic region; often combined with a VPN/proxy fingerprint. |
User‑Agent string | Mozilla/5.0 (Windows NT 10.0; Win64; |
Reveals OS, browser version, device class. |
Accept‑ headers* (Accept-Language , Accept-Encoding ) |
en‑US,en;q=0.9 |
Indicates preferred language and sometimes locale. |
Referrer | https://news.example.com/article |
Can be used for cross‑site tracking. |
Cookies / LocalStorage / IndexedDB keys | session_id=… |
Persistent identifiers that can be linked to the fingerprint. |
ETag / Cache‑control | W/"123456" |
Occasionally leveraged for “cache‑based” tracking. |
2. Active JavaScript‑derived properties (queried after the page loads)
Category | Specific APIs / Properties | Typical values | Fingerprint usefulness |
---|---|---|---|
Screen &
view-port |
screen.width/height , window.innerWidth/innerHeight , devicePixelRatio , colorDepth |
1920×1080 , 2 , 24‑bit |
Gives device class (desktop vs laptop vs tablet) and resolution bucket. |
Time & locale | Intl.DateTimeFormat().resolvedOptions().timeZone , new Date().getTimezoneOffset() , navigator.language , navigator.languages |
America/New_York , -300 , en‑US |
Helps narrow geographic region and OS language settings. |
Hardware concurrency | navigator.hardwareConcurrency |
4 cores |
Indicates CPU core count, useful for distinguishing between low‑end laptops and desktops. |
Device memory | navigator.deviceMemory |
8 GB |
Rough RAM bucket. |
Touch & pointer capabilities | navigator.maxTouchPoints , window.matchMedia('(pointer:fine)') |
0 (no touch) |
Differentiates phones/tablets from desktops. |
Battery status (deprecated in many browsers) | navigator.getBattery() |
charging: false, level: 0.57 |
Adds another entropy source. |
Network information | navigator.connection (effectiveType, downlink) |
effectiveType: "4g" |
Slightly distinguishes connection quality. |
Media devices | navigator.mediaDevices.enumerateDevices() |
List of microphones, cameras | Reveals attached peripherals (e.g., external webcam). |
WebGL / GPU | WebGLRenderingContext.getParameter(UNMASKED_VENDOR_WEBGL) , ...RENDERER_WEBGL |
Intel Inc. , Intel |
GPU vendor/model is a strong identifier. |
Canvas fingerprint | canvas.toDataURL() or getImageData() on a hidden canvas |
Base64 hash of rendered image | Produces a stable hash that varies by GPU, drivers, anti‑aliasing settings. |
Audio fingerprint | OfflineAudioContext rendering → frequency data |
Hash of generated audio buffer | Sensitive to sound card and OS audio stack. |
Font enumeration | document.fonts.check() , CSS @font-face probing, measuring text width |
List of available fonts (e.g., Arial , Helvetica ) |
Font sets differ between OSes and installed software. |
Plugin/MIME types (mostly legacy) | navigator.plugins , navigator.mimeTypes |
Shockwave Flash , application/pdf |
Still useful on older browsers. |
CSS media queries | window.matchMedia('(prefers-color-scheme: , (prefers-reduced-motion) |
true/false |
Adds tiny bits of OS‑level preference data. |
Pointer/Mouse movement | Event timestamps, clientX/clientY deltas, velocity |
Sequence of numbers | Behavioral fingerprint; can differentiate bots from humans. |
Keyboard timing | keydown /keyup intervals |
Millisecond gaps | Another behavioral signal. |
Scroll behavior | scrollTop changes over time |
Patterns of scrolling speed | Contributes to behavioral uniqueness. |
Service‑worker / cache keys | caches.keys() |
Names of caches created by the site | May reveal previously visited services. |
WebRTC ICE candidates | RTCPeerConnection → local IP addresses (private LAN) |
192.168.1.23 |
Exposes local network topology (often blocked by privacy settings). |
Entropy from random number generators | crypto.getRandomValues() (some implementations leak subtle timing) |
Slight variations | Rare but can add a few bits. |
3. Cross‑site aggregation
Even if a single site only sees a subset of the above, trackers combine data from many domains (via third‑party scripts, shared CDNs, or advertising networks). The more overlapping fields they collect, the higher the probability that the composite fingerprint is globally unique (often > 99 % uniqueness across the internet).
4. What can be blocked or masked?
Feature | Typical mitigation | Effect on fingerprint |
---|---|---|
User‑Agent | Override via general.useragent.override (Firefox) or UA‑spoof extensions (Chrome) |
Reduces OS/browser specificity; may cause site compatibility issues. |
Canvas / WebGL | Block or add noise (canvas-blocker , trace , webgl.disabled ) |
Breaks deterministic canvas & GPU hashes; may disable visual effects. |
Fonts | Hide font list (layout.css.font-visibility.private ) |
Removes a large entropy source. |
Hardware concurrency / device memory | Randomize via user.js or extensions |
Lowers hardware‑specific uniqueness. |
Timezone / language | Randomize per session | Prevents geographic anchoring. |
Screen size | Round to common buckets (e.g., 1366×768) | Reduces resolution entropy. |
Audio / Canvas noise | Small perturbations (±1 pixel, ±1 sample) | Keeps UI functional while breaking hash stability. |
WebRTC IP leakage | Disable WebRTC or use a VPN that blocks ICE candidates | Stops local‑network fingerprinting. |
Battery / Network info | Many browsers already restrict these; can be disabled via flags. | Removes minor entropy. |
Kill them with a custom DNS list
This is one way of stopping most f the traffic that uses commercial services. These are some of the “known” offenders of this technology. I encourage you to do some research on your own and when you do please comment down below so that I can include it (if you want credit that is fine or you can remain anonymous).
Here is a simple list that I am currently testing out:
# Fingerprint‑tracking / analytics /
# ad‑network domains
# (one entry per line – map to
# 0.0.0.0 or :: to block)
# ——————————————————————————
0.0.0.0 www.google-analytics.com
0.0.0.0 analytics.google.com
0.0.0.0 ssl.google-analytics.com
0.0.0.0 www.googletagmanager.com
0.0.0.0 stats.g.doubleclick.net
0.0.0.0 adservice.google.com
0.0.0.0 pagead2.googlesyndication.com
0.0.0.0 tpc.googlesyndication.com
0.0.0.0 connect.facebook.net
0.0.0.0 graph.facebook.com
0.0.0.0 staticxx.facebook.com
0.0.0.0 facebook.com/tr/
0.0.0.0 fbcdn.net
0.0.0.0 platform.twitter.com
0.0.0.0 analytics.twitter.com
0.0.0.0 t.co# LinkedIn
0.0.0.0 snap.licdn.com
0.0.0.0 tags.linkedin.com
0.0.0.0 cdn.linkedin.com
# TikTok
0.0.0.0 analytics.tiktok.com
0.0.0.0 ads.tiktok.com
0.0.0.0 tiktok.com/i18n/pixel/
# Amazon Advertising / Attribution
0.0.0.0 attribution-api.amazon.com
0.0.0.0 aax-us-east.amazon-adsystem.com
0.0.0.0 aax-eu-west.amazon-adsystem.com
# Microsoft Clarity
0.0.0.0 www.clarity.ms
0.0.0.0 clarity-prod.azureedge.net
# Hotjar / FullStory / Crazy Egg
0.0.0.0 static.hotjar.com
0.0.0.0 script.hotjar.com
0.0.0.0 www.fullstory.com
0.0.0.0 cdn.crazyegg.com
# Cloudflare Bot Management / Radar
0.0.0.0 cf.radar.cloudflare.com
0.0.0.0 challenge.api.cloudflare.com
# Akamai Bot Manager / EdgeScape
0.0.0.0 akamai.botmanager.com
0.0.0.0 edgesuite.net
0.0.0.0 edgescape.com
# Imperva / Incapsula
0.0.0.0 incapsula.com
0.0.0.0 www.imperva.com
0.0.0.0 cdn.imperva.com
# FingerprintJS (commercial)
0.0.0.0 api.fpjs.io
0.0.0.0 cdn.jsdelivr.net/npm/@fingerprintjs/fingerprintjs*
0.0.0.0 fingerprintjs.com
# Amplitude / Mixpanel / Segment
0.0.0.0 api.amplitude.com
0.0.0.0 api.mixpanel.com
0.0.0.0 cdn.segment.com
# Adobe Analytics
0.0.0.0 assets.adobedtm.com
0.0.0.0 sc.advertising.com
# Snowplow
0.0.0.0 collector.snplow.net
0.0.0.0 sp-js.com
# Yandex Metrica
0.0.0.0 mc.yandex.ru
0.0.0.0 metrika.yandex.com
# Plausible (self‑hosted but often pulled from CDN)
0.0.0.0 plausible.io
0.0.0.0 cdn.plausible.io
# Matomo (cloud version)
0.0.0.0 matomo.cloud
# Sentry (error‑tracking SDK)
0.0.0.0 o0.ingest.sentry.io
0.0.0.0 sentry.io
# New Relic Browser
0.0.0.0 js-agent.newrelic.com
0.0.0.0 nr-data.net
# Dynatrace RUM
0.0.0.0 *.rum.dynatrace.com
# LogRocket
0.0.0.0 logrocket.com
0.0.0.0 lr-cdn.net
# Inspectlet
0.0.0.0 www.inspectlet.com
# Quantcast Measure
0.0.0.0 quantserve.com
0.0.0.0 pixel.quantserve.com
# Criteo / AdRoll
0.0.0.0 static.criteo.net
0.0.0.0 cdn.adroll.com
# Taboola / Outbrain / Revcontent
0.0.0.0 cdn.taboola.com
0.0.0.0 widgets.outbrain.com
0.0.0.0 revcontent.com
# DoubleClick (Google Marketing Platform)
0.0.0.0 doubleclick.net
0.0.0.0 ad.doubleclick.net
# Bing Ads UET
0.0.0.0 bat.bing.com
# Salesforce Marketing Cloud Web Collect
0.0.0.0 sbmmc.com
# HubSpot Tracking
0.0.0.0 hubspot.com
0.0.0.0 hs-scripts.com
# Pardot
0.0.0.0 pi.pardot.com
# Zoho SalesIQ
0.0.0.0 salesiq.zoho.com
# Intercom / Drift / LiveChat / Crisp / Tawk.to
0.0.0.0 messenger.intercom.io
0.0.0.0 js.intercomcdn.com
0.0.0.0 drift.com
0.0.0.0 livechatinc.com
0.0.0.0 crisp.chat
0.0.0.0 tawk.to
# Olark / Zendesk Chat / Freshchat / Smartsupp
0.0.0.0 olark.com
0.0.0.0 zendesk.com
0.0.0.0 freshchat.com
0.0.0.0 smartsupp.com
# Survey / Form services (they embed tracking scripts)
0.0.0.0 surveymonkey.com
0.0.0.0 typeform.com
0.0.0.0 qualtrics.com
# Trustpilot widget
0.0.0.0 trustpilot.com
# CAPTCHA services (they also collect fingerprint data)
0.0.0.0 www.recaptcha.net
0.0.0.0 hcaptcha.com
# Generic CDN domains that frequently host fingerprint scripts
0.0.0.0 cdn.jsdelivr.net
0.0.0.0 ajax.googleapis.com
0.0.0.0 cdnjs.cloudflare.com
# ——————————————————————
# End of list
# ——————————————————————
Summary
We covered the whole toolbox you need to make a browser‑level anti‑fingerprinting strategy that works across Firefox, Chrome/Chromium while still keeping everyday sites (video‑chat, streaming, SaaS) functional. As you can see, the issue is complicated. Fortunately there are strategies that you can use to lessen the threat. By using plugins, settings, some custom scripts and DNS – You can do a lot to mitigate these problems. I will add to this post and update it as new information comes to light. Hit me up in the comments if you have any information.