← back to blog

Font fingerprinting: why the fonts on your machine give you away

Every operating system ships with a default set of fonts. Every piece of software you install adds more. Adobe apps drop in a pile of them. Office adds another batch. That game you installed three years ago might have bundled a custom font for its UI. Over time, the exact list of fonts on your machine becomes almost as unique as a fingerprint, because it reflects your specific install history, not just your OS version.

Font fingerprinting is one of the oldest and most reliable techniques in the browser fingerprinting toolkit, and it still works well in 2026 because fonts sit in an awkward spot: the browser needs to know what’s installed to render text correctly, but exposing that list to a webpage tells the page a lot about the machine underneath.

How a page actually gets your font list

There’s no direct API that returns “here are all your fonts” as a clean array. Instead, sites measure text.

The classic method: render a string of text using a generic fallback font (like monospace or sans-serif), measure the width and height of that rendered text in pixels. Then render the same string again, this time requesting a specific font by name (say, Calibri or Helvetica Neue), with the same fallback listed after it. If that specific font is installed, the browser uses it, and the measured dimensions change because different fonts have different letter widths and heights. If the font isn’t installed, the browser silently falls back to the generic font and the measurements come out identical.

Run this test against a list of a few hundred common font names and you get a bitmap: font present, font absent, font present, font absent. That bitmap is the fingerprint. Sites like BrowserLeaks and the EFF’s Cover Your Tracks demonstrate this exact technique, and it’s been in production fingerprinting scripts (FingerprintJS and similar) for years because it doesn’t need any special permission, just a <canvas> or a hidden <span> and some JavaScript timing.

A second, related method piggybacks on canvas fingerprinting. When you draw text to a <canvas> element and read back the pixel data, the exact rasterization depends on the font’s hinting, anti-aliasing, and the underlying rendering engine (which itself differs by OS and even by OS patch level). So canvas fingerprinting and font fingerprinting overlap: the same test can reveal both which fonts you have and subtle rendering fingerprints tied to your GPU driver and font rasterizer.

Why the list is so identifying

A stock Windows 11 install has a known, fairly short list of default fonts. A stock macOS install has a different known list. That alone gets you OS and rough version. But the interesting entropy comes after that.

  • Design and creative software (Adobe Creative Cloud, Affinity, CorelDRAW) installs dozens to hundreds of fonts.
  • Microsoft Office and LibreOffice each add their own bundled sets, and the exact set has changed across versions.
  • Language packs add fonts for CJK, Arabic, Cyrillic, and other scripts, which tells a site something about your locale even if you’re spoofing your Accept-Language header.
  • Enterprise software, PDF tools, and even some games silently register system fonts on install.

Cross-reference all of that against a database of what “normal” machines look like, and a font list that’s slightly too rich, or has an odd combination (a Windows-only font showing up alongside a Mac default), stands out immediately. That mismatch is exactly what anti-fraud vendors look for: not “this is a bot” but “this doesn’t add up.”

Where anti-detect browsers actually intervene

Anti-detect browsers approach this a few different ways, and it’s worth understanding what each one is actually doing under the hood rather than trusting a marketing page.

Font list spoofing. The browser intercepts the font-enumeration and text-measurement calls and returns a controlled, consistent list instead of the real system fonts. Done properly, this means the font-detection script gets a plausible answer that matches the fake OS and browser version the profile is presenting. Done sloppily, it produces a list that’s internally inconsistent, like a “Windows” profile reporting macOS-only fonts, which is worse than doing nothing because it’s an active red flag rather than a passive gap.

Canvas noise injection. Since font rendering feeds into canvas fingerprinting, some tools add controlled per-profile noise to canvas output so the same physical machine doesn’t produce the same canvas hash across two different browser profiles. This addresses the “linking” problem (two profiles look identical because they’re the same hardware) more than the “this looks fake” problem.

Isolated rendering environments. Some tools (or setups people build around them) run each profile in a more fully separated environment, sometimes with different actual font packages installed per container, so the font list isn’t spoofed at all, it’s genuinely different because the underlying environment is different. This is more resource-intensive but avoids the internal-consistency problem entirely, since there’s nothing “faked,” just genuinely different installed software.

I’ve tested Multilogin, GoLogin, Kameleo, AdsPower, and Dolphin Anty side by side on this specific point, checking their profile output against BrowserLeaks’ font test and against Cover Your Tracks. The honest summary: all of them spoof or normalize the font list to some degree, and the ones that pair it with matching canvas and WebGL spoofing produce a more internally consistent picture than the ones that only touch the font list in isolation. None of them make the fingerprint disappear. What changes is whether the fingerprint looks like a plausible, common configuration or an obviously synthetic one. A detection system that’s specifically hunting for “known anti-detect signature” patterns (mismatched font-OS pairs, fonts that only ship with specific automation tooling, telltale gaps in otherwise-complete lists) can still flag a profile even when the spoofing is technically well executed, because the flag isn’t “fonts are fake,” it’s “this exact combination doesn’t occur on real hardware.”

What this means if you’re evaluating a tool

If you’re testing an anti-detect browser for multi-accounting work, don’t just check whether the font list looks “full.” Check whether it’s consistent with everything else the profile presents: does the font set match the claimed OS and OS version, does it match the claimed browser build, does it correlate sensibly with the claimed timezone and locale (a profile claiming to be in Vietnam with only Western European fonts installed is a mismatch worth noticing). Run the profile through BrowserLeaks’ font page and Cover Your Tracks and actually read the output rather than trusting a pass/fail summary, since both tools show you the underlying data, not just a verdict.

It’s also worth remembering that font fingerprinting is one signal among many that platforms combine. A perfectly spoofed font list sitting on top of an inconsistent canvas hash, or a WebGL renderer string that doesn’t match the claimed GPU, still adds up to a flagged profile. No anti-detect browser I’ve tested claims to solve this in isolation, and any vendor page that implies a font fix alone makes a profile invisible is oversimplifying what’s actually a much broader consistency problem across dozens of signals at once.

None of this is a bypass guide and none of it is a guarantee. Platforms update their detection logic regularly, and what looks consistent today can look synthetic again after the next model update on their end. Treat every anti-detect tool as something to test against current detection pages yourself, on a regular basis, rather than something to trust once and forget.

If you want to see how these tools actually behave when we run them against real fingerprinting tests, head back to the Anti-Detect Review home page for the full video breakdowns and written test notes.

Get new guides and videos first — join the Telegram channel.

need infra for this today?