A VPN changes your IP address. It doesn’t change your browser, and browser fingerprinting reads the browser. We ran Google Chrome on the same machine with and without a VPN, cleared every cookie in between, and the fingerprinting scripts handed back the same visitor ID all three times. Only the address in front of the request moved.
That gap is why people mix up VPNs, proxies and antidetect browsers: each one changes a different layer of what a site sees. This page follows one fingerprint from the APIs a script reads to the hash a tracker stores, then shows what a VPN and an antidetect profile did to it on public test pages (CreepJS, FingerprintJS and BrowserLeaks). Every run below was made on Ubuntu 26.04 in October 2026 with Google Chrome 156, Cloudflare WARP and the open-source Camoufox antidetect browser, and the numbers we quote from studies are linked in the Sources section.
A fingerprint is a hash of what your browser reports
Browser fingerprinting identifies you by combining dozens of small facts your browser gives away to any page that asks, then hashing them into one ID. No single fact is rare. Plenty of people run Chrome on Linux at 1366×768, but very few share the exact combination of fonts, GPU string, timezone, language list and canvas output that your machine produces.
A script collects those facts in a fraction of a second. The FingerprintJS demo took 206 to 339 ms across our Chrome runs. The usual inputs fall into a few groups:
- Headers: User-Agent, Accept-Language, client hints
- Navigator values: platform, CPU cores, device memory
- Display: screen size, color depth, pixel ratio
- Rendering: canvas, WebGL renderer, audio output
- Locale: timezone, Intl formats, installed fonts
- Media: number of cameras and microphones
What makes this different from a cookie is that nothing is stored on your side. When you clear site data, open a private window or start a fresh profile, the fingerprint does not reset, because the script just reads your machine again. Our second Chrome run used a brand-new profile directory and produced the identical ID.
Most browsers stand out from the crowd
How unique is a fingerprint in practice? It depends heavily on who you count. The EFF’s Panopticlick study found 83.6% of 470,161 browsers unique in 2010, with at least 18.1 bits of entropy, while a 2018 study of more than two million visitors to a large French site found only 33.6% unique.

The gap between the bars is mostly sampling. Panopticlick and AmIUnique drew privacy-curious volunteers on desktops with plugins and odd fonts, and the Panopticlick paper calls its own sample “quite biased”.
The 2018 French sample is closer to ordinary traffic, and phones (18.5% unique) look alike because they ship identical hardware and fonts. If you sit in that third, a tracker can follow you without a cookie.
Trackers use it. FP-Inspector found fingerprinting scripts on more than 10% of the top 100K websites and over a quarter of the top 10K. Google dropped its ad-platform rule against device fingerprinting on February 16, 2025, a change the UK ICO called “irresponsible”.
Rendering leaks the hardware
Canvas, WebGL and audio fingerprints are the strongest signals because they come from the machine, not from a setting you can change. When a script asks the browser to draw the same text and shapes on a hidden canvas, the pixels differ slightly between GPUs, drivers and font renderers, so the hash of that image is close to a hardware serial.
Our probe drew a fixed string and an arc on a 280×60 canvas and hashed the result. Chrome on the lab VM returned these values every time:
- Canvas hash:
a3fbbca0b84c78a5 - Audio sum:
124.04347503720783 - WebGL renderer: ANGLE on SwiftShader
The renderer line is a tell in its own right. A VM without a GPU falls back to Google’s SwiftShader software renderer, and CreepJS scored our headful Chrome as “50% like headless”, likely partly because of it. A real desktop would report its actual card, which is exactly what makes it identifiable.
One machine, six browser runs
The lab was a single Ubuntu 26.04 VM (4 vCPU, 6 GB RAM) with an Xvfb display, so every browser ran headful against the same hardware. A Playwright script opened four public test pages in a fresh profile each time and read the values above straight from each page: ipinfo.io, the FingerprintJS demo, CreepJS and BrowserLeaks WebRTC. The six runs, in order:
- Chrome, home connection
- Chrome, new empty profile, home connection
- Chrome, Cloudflare WARP connected
- Camoufox profile A, home connection
- Camoufox profile B, home connection
- Camoufox with
geoip=True, WARP connected
Public IPs below are replaced with documentation addresses. Everything else is what the pages returned:
| Run | Exit IP and ASN | OS and GPU reported | Timezone | Canvas hash | FingerprintJS ID |
|---|---|---|---|---|---|
| 1 Chrome | 203.0.113.24, home ISP | Linux, SwiftShader | UTC | a3fbbca0b84c78a5 | e12688fe…d346 |
| 2 Chrome, new profile | 203.0.113.24, home ISP | Linux, SwiftShader | UTC | a3fbbca0b84c78a5 | e12688fe…d346 |
| 3 Chrome + WARP | 198.51.100.149, AS13335 Cloudflare | Linux, SwiftShader | UTC | a3fbbca0b84c78a5 | e12688fe…d346 |
| 4 Camoufox A | 203.0.113.24, home ISP | Windows, Intel HD Graphics | UTC | 21cb520da7f6ab94 | 5bb31794…2619 |
| 5 Camoufox B | 203.0.113.24, home ISP | Linux, Intel HD Graphics | UTC | 17f357e754ad51b1 | 792880ba…0675 |
| 6 Camoufox geoip + WARP | 198.51.100.149, AS13335 Cloudflare | Windows, NVIDIA GTX 980 | Africa/Nairobi | 042a8bcaca0d2bd4 | 1b48a40a…fc05 |
Read the table by column, the way a tracker would. Rows 1 to 3 change only the second column, so every fingerprint value survives both a clean profile and a VPN. Rows 4 and 5 change every fingerprint value while the IP stays the same, and row 6 changes both. CreepJS agreed with FingerprintJS on every row: its FP ID was identical for the three Chrome runs and different for each Camoufox run.
A VPN only rewrites the network layer
A VPN encrypts traffic between you and its exit server and gives sites the exit’s IP instead of yours. That hides your address from the site and your browsing from the local network.
It does nothing to the JavaScript running inside the page. The script reads values on your machine and sends them back through the same tunnel you just opened, so your fingerprint arrives intact with a new return address on it.

For the VPN runs we used Cloudflare WARP, the free client that needs no account (the lab installed the cloudflare-warp package from Cloudflare’s apt repo at pkg.cloudflareclient.com). A fresh client has to register once before it can connect:
warp-cli --accept-tos registration new
After that, connecting is one command, and warp-cli settings on our client showed it tunnelling over MASQUE:
warp-cli --accept-tos connect
Cloudflare’s trace endpoint tells you which path a request took. Run it before and after connecting:
curl -s https://www.cloudflare.com/cdn-cgi/trace | grep -E '^(ip|colo|loc|warp)='
With WARP connected, warp=on appears and the exit moved from a Mombasa edge to Johannesburg, while loc still reads Kenya:
ip=2001:db8:3b80:8::2d:ba
colo=JNB
loc=KE
warp=on
Two details are easy to miss. WARP handed the VM an IPv6 exit as well as IPv4, so curl reported the v6 address while the browser pages showed v4. And ipinfo still placed both exits in Nairobi, which matches Cloudflare’s own FAQ: WARP uses a Cloudflare IP that represents your approximate location. It is a privacy tool, not a way for you to appear in another country.
CreepJS shows the result in one screen. The fingerprint header did not move, and the only new value is the STUN candidate carrying the WARP address:

- 1Same FP ID as without the VPN
- 2WARP exit IP
- Same FP ID as without the VPN:
9a6668da...on runs 1, 2 and 3. - WARP exit IP: the only value WARP changed (masked here).
WebRTC did not leak anything in any run. Chrome and Camoufox both hid the LAN address behind an mDNS .local host candidate, and BrowserLeaks listed only the exit IP. That used to be the classic VPN leak, and modern browsers closed it, so a site already knows the WARP IP and learns nothing extra.
Antidetect browsers rewrite the signals
An antidetect browser attacks the other half: it changes what the APIs return so each profile looks like a different machine. Camoufox, a Firefox build licensed under MPL-2.0, does this in the browser’s C++ code rather than with injected JavaScript, and CreepJS scored it only “6% like headless” against Chrome’s 50% on the same VM. Commercial products such as Multilogin, GoLogin and AdsPower do the same on Chromium or Firefox cores and add profile management, team sharing and proxy slots.
Each Camoufox launch got a new identity. Profile A claimed Windows with Intel graphics and fonts like Calibri and MS UI Gothic, profile B claimed Linux with Intel graphics, and the geoip run claimed Windows with an NVIDIA GTX 980. Camoufox is driven from Python (the lab installed it in a Python venv with pip install "camoufox[geoip]" and python -m camoufox fetch, and had to pin numpy 2.3.5 because newer numpy would not import on the VM’s kvm64 vCPU), so a short script shows what a profile reports. Create it:
vim cf-geoip.py
Paste this, which launches one profile with geoip=True and prints three values a fingerprinting script would read:
from camoufox.sync_api import Camoufox
with Camoufox(geoip=True, headless=True) as browser:
page = browser.new_page()
page.goto("https://ipinfo.io/json")
print(page.evaluate("navigator.userAgent"))
print(page.evaluate("Intl.DateTimeFormat().resolvedOptions().timeZone"))
print(page.evaluate("navigator.languages"))
Run it with the Python that has Camoufox installed:
python3 cf-geoip.py
On our Nairobi connection it picked a Linux Firefox identity this time, with the locale taken from the IP:
Mozilla/5.0 (X11; Linux x86_64; rv:156.0) Gecko/20100101 Firefox/156.0
Africa/Nairobi
['sw-KE', 'sw']
The geoip flag is the part people skip. Profiles A and B reported a UTC timezone while ipinfo placed their IP in Nairobi, and that mismatch is a cheap check for any fraud system. With geoip=True behind WARP, Camoufox set the timezone to Africa/Nairobi and the language list to sw-KE, sw:

- 1New FP ID on every launch
- 2Timezone follows the exit IP
- New FP ID on every launch:
881b85a3...matches neither earlier profile. - Timezone follows the exit IP: Africa/Nairobi, offset -180.
Spoofing has its own seams, and you should check them before you trust a profile. In the geoip run, navigator.languages said sw-KE, sw while the CreepJS Intl panel in the figure above still read en-US and American English, two answers to the same question that a careful checker can compare.
All three profiles also kept the VM’s real four CPU cores, reported no deviceMemory (Firefox does not expose it), and claimed a microphone and webcam the VM doesn’t have. None of that broke CreepJS, but each is a value a stricter checker can compare.
Privacy browsers blend in instead
There are two opposite ways to beat fingerprinting: look different every time, or look like everyone else. Antidetect browsers and Brave take the first route, and Brave randomizes values per session, per site and per storage area. Tor Browser and Mullvad Browser take the second, so their users report window sizes rounded to common buckets, the UTC timezone and a fixed font set. Firefox and Safari now ship partial protections of their own:
| Approach | Changes your IP | Changes the fingerprint | Who it suits |
|---|---|---|---|
| VPN (WARP, Mullvad VPN, Proton VPN) | Yes | No | Hiding traffic from the local network and your IP from sites |
| Proxy (datacenter or residential) | Yes, per request or session | No | Scraping, geo testing, pairing with an antidetect profile |
| Antidetect browser (Camoufox, Multilogin, GoLogin) | No, add a proxy | Yes, a new identity per profile | Running many separate accounts or test identities |
| Brave | No | Randomized per site and session | Daily browsing with cross-site tracking cut |
| Tor Browser, Mullvad Browser | Tor yes, Mullvad Browser needs a VPN | Mostly made uniform across users | Anonymity where blending in matters most |
| Firefox 145+, Safari 17+ | No | Partly, mainly private windows | Lowering exposure without changing browsers |
The table hides one trade-off. A uniform browser only works while lots of people use the same build, so changing its window size or adding extensions makes you stand out again. A randomizing browser avoids that, but a fingerprint that changes on every visit is itself unusual, which is why fraud tools weigh consistency across a session as heavily as the values themselves. If you want the Tor approach on Linux, our guide to installing Tor Browser on Ubuntu and Debian covers it, and Brave has its own Fedora install guide.
Tools in this space
These are the products you’ll meet when you go shopping for each layer. The list is alphabetical within groups, it is not a ranking, and we only tested Camoufox and WARP:
- AdsPower: antidetect browser with a Chromium core (SunBrowser) and a Firefox core (FlowerBrowser), plus a free plan with 2 profiles.
- Camoufox: open-source Firefox build that spoofs fingerprints in C++ and is driven from Python or Playwright; its README says it is under development and may not suit stable production use.
- Cloudflare WARP: free VPN-style client for Windows, macOS, Linux and phones that can tunnel over MASQUE (ours did) and keeps your approximate location.
- Dolphin{anty}: antidetect browser aimed at affiliate and ads teams, with 3 free profiles on sign-up.
- GoLogin: antidetect browser with cloud and desktop profiles and a free plan of 3 profiles.
- Multilogin: antidetect browser built on its Chromium-based Mimic core, with a free plan of 5 profiles; its Firefox-based Stealthfox core is no longer updated.
- Mullvad VPN and Mullvad Browser: a flat-price VPN at EUR 5 a month and a Tor Project-built browser that makes its users look alike.
- Residential proxy networks (Bright Data, Oxylabs): sell exit IPs on home connections, which antidetect profiles pair with so the IP type fits the fingerprint.
Whichever you pick, pair the layers deliberately. An antidetect profile on your home IP gives every identity the same address, and a VPN on a stock browser gives one identity many addresses. If you run your own tunnel instead of a commercial VPN, a WireGuard server on Fedora or a travel router with WireGuard changes the IP the same way WARP did and leaves the fingerprint alone too. We also covered one commercial option, MoreLogin, separately.
Test your own browser from outside
You can repeat the core of this lab in ten minutes with nothing but your normal browser. What matters is comparing IDs between runs, not reading one score in isolation. In order:
- Open the FingerprintJS demo and CreepJS, note both IDs
- Clear site data or open a private window, reload both
- Connect your VPN, reload, then check BrowserLeaks WebRTC
- Compare the timezone CreepJS prints with your exit IP’s country
If the IDs from step 1 survive steps 2 and 3, you’ve reproduced our Chrome result: the VPN protected your address and nothing else. EFF’s Cover Your Tracks and AmIUnique add a uniqueness estimate against their own visitors, which, as the chart showed, says as much about their audience as about you. For a system-wide proxy instead of a VPN, the Ubuntu and Debian proxy settings guide gets the same exit-IP change for every app.
Sources
Every figure and claim above that isn’t from our lab comes from these:
- Eckersley, “How Unique Is Your Web Browser?”, PETS 2010 (83.6% unique of 470,161, 18.1 bits, sample bias): EFF PDF
- Laperdrix et al., “Beauty and the Beast”, IEEE S&P 2016 (118,934 fingerprints): DOI; the 89.4% figure is quoted from the authors’ 2020 survey: arXiv 1905.01051
- Gómez-Boix et al., “Hiding in the Crowd”, WWW 2018 (2,067,942 fingerprints, 33.6% unique): DOI; mobile 18.5% from the same survey
- Iqbal et al., “Fingerprinting the Fingerprinters” (10% of top 100K, a quarter of top 10K): arXiv 2008.04480
- Google platforms program policy change of February 16, 2025: Google support; ICO response: ico.org.uk
- WebRTC mDNS host candidates: IETF draft
- Cloudflare WARP Linux setup, modes (MASQUE) and location FAQ: Linux client, WARP modes, FAQ
- Camoufox (MPL-2.0, C++ level spoofing, geoip): GitHub
- Brave fingerprint randomization: Brave wiki; Mullvad Browser uniform fingerprint: mullvad.net
- Firefox 145 fingerprinting protection (Private Browsing and Strict mode): release notes; Safari Advanced Fingerprinting Protection: WebKit blog
- Chrome User-Agent reduction (
Chrome/156.0.0.0): chromium.org - Free plans and prices (AdsPower, Dolphin{anty}, GoLogin, Multilogin, Mullvad VPN) from each vendor’s pricing page, checked October 2026; FingerprintJS demo, CreepJS and BrowserLeaks were the public test pages used in the lab
Lab values (IDs, hashes, timezones and the WARP trace) come from our own runs on October 31, 2026, with public IP addresses replaced by documentation ranges.