Skip to main content

Browser stealth explained: canvas fingerprinting

September 7, 2026
Share

Tiny differences in a drawing can reveal a browser's environment. Changing the pixels can also create inconsistencies a website can spot.

Canvas is the drawing surface websites use for charts, games, and image editing. A page can ask the browser to draw something, then read the colors of its pixels.

Give two browsers the same instructions and they can return slightly different colors, even when the pictures look identical. Canvas fingerprinting uses those differences to help recognize a browser's environment.

Bot protection can also check whether that output fits the browser's claims. DataDome lists canvas rendering and consistency checks among its Device Check challenges. For a stealth browser, changing the picture's fingerprint still leaves those comparisons to handle.

Why the same drawing can produce different pixels

Fonts and drawing software affect how a browser turns instructions into an image. The Pixel Perfect study explored how those differences reveal information about the browser's environment.

Take a pixel on the edge of a letter. Part of it is ink and part is background, so the browser must choose a color somewhere between the two. Different ways of calculating that coverage can produce slightly different values. Across a whole drawing, those small differences become measurable.

Same path · 3 × 3 samplingpixel (15, 8)2 / 9 in inkR 204Same path · 8 × 8 samplingpixel (15, 8)16 / 64 in inkR 198
0.0 / 5s
Teaching model of edge coverage, using 3 × 3 and 8 × 8 sampling. These are not operating-system font captures.

A page can read the pixels with getImageData() and turn the result into a hash, a short signature that is easy to compare. Browsers with the same output share that signature. An update can change it on the same machine.

Checking whether the browser's claim fits

A detector can compare a canvas signature with results from known browser environments. If a browser claims to be mobile but matches a desktop reference, that conflict gives the detector a reason to question the claim.

Google's 2016 Picasso research explored this approach using drawing challenges to check claimed device classes. Each class could include many devices.

Browser under testCanvas hash71bf903aClaimed environmentMobile profileClaim and rendering disagreeA reason to investigate furtherReference profilesIllustrative database · same canvas probeEnvironmentCanvas hashMobile profilea93e12b4Desktop profile Ae7204c18Desktop profile B71bf903aMatches desktop profile BShared configuration, not personal identity
0.0 / 6s
Illustrative profiles and hashes, not captured mobile or desktop fingerprints. A profile conflict alone does not establish automation.

The reference results must come from the same drawing task. They also need enough coverage: an unfamiliar font or browser update may produce a result the database has never seen.

Another check simply repeats a read. FingerprintJS extracts an unchanged canvas twice and marks the result unstable if the answers differ. Privacy browsers can cause this too, so Castle considers randomized results alongside other signals.

Why adding noise can backfire

A defense can slightly change the pixel values returned to the page while leaving the displayed image unchanged. Brave varies its adjustments by session, site, and storage area.

Choosing new noise on every read creates a giveaway: an unchanged pixel might return 78, then 76, then 78. Repeated checks can expose that instability. If the offsets are independent and average to zero, enough reads can also help recover the original value.

Reusing an adjustment keeps repeated reads stable. But different ways of extracting the same image still need to agree. A page can compare raw pixels with an exported image and notice if only one path changes them.

There are practical costs too. Image editors work with these pixel values, so changes can affect their output. Mozilla documents problems with background removal and progressive drawing under Firefox's fingerprinting protection.

How Notte handles canvas

Our Chromium patches share the same adjustment logic across pixel reads and image exports. With the same configured seed, unchanged pixels receive the same adjustment each time.

Doing this inside the browser engine lets us coordinate the different ways a page can retrieve an image. Changing just one JavaScript method would leave the other paths open for comparison.

Notte sessions provide managed browsers with these changes alongside protections for WebGL and audio. Canvas is one part of the environment a bot detector evaluates.

Browser stealth explained: canvas fingerprinting | Notte