Questa pagina non è ancora nella sua lingua. Sta leggendo il testo in inglese.
Glossary
Canvas noise
Canvas noise is a defence that shifts pixels before a site reads them, so a drawing carries a value of its own.
How the shift is applied
A drawing is made of channel values, four bytes to a pixel. Noise adds a small offset to those bytes, and the offset is derived from the seed of the profile rather than drawn fresh each time.
The seed is what makes the result repeatable. One profile answers itself the same way on every visit, and two profiles answer differently.
- 1
The page draws as usual
Text, shapes and colours land on an off screen canvas that is never shown. No permission is asked, because nothing here counts as private to the browser.
- 2
The offsets go on
Each channel moves by a small amount decided by the seed. The offset belongs to the pixel, not to its position in the buffer handed back.
- 3
The page reads the result
The bytes come back shifted, and the hash the site stores is a different one. The picture itself is still a picture and still reads as one.
Your canvas right now
These values are read in your browser on this page. The hash is what a site would store about this machine.
Nothing here leaves this page. The reading is drawn on the spot, and a checker that sends your hash somewhere has already collected it.
Il suo dispositivo, adesso
- Canvas hash
- misurazione sul suo dispositivo
- Graphics renderer
- misurazione sul suo dispositivo
- Device pixel ratio
- misurazione sul suo dispositivo
Letto nel suo browser e mostrato qui. Nulla viene inviato da nessuna parte.
Where the shift has to sit
Adding an offset is easy. Adding it where a second look cannot find it is the whole job, and four placements fail that test.
A real machine never disagrees with itself. Every failure below is a browser contradicting its own answer, which is louder than any unusual value.
Offsets tied to the buffer
If the offset follows the position in the returned array rather than the pixel, the same strip read through two windows disagrees with itself.
Offsets ignoring transparency
Colour under full transparency carries no meaning, and no real driver produces it. A site can test for it in three lines.
Offsets that never change
A mask learned from a solid fill can be subtracted from any other drawing. At that point the defence has become the mark it was meant to hide.
Offsets written over the page
A wrapper around a read function has to look native to anything that inspects it. The self-test puts that question to the graphics reader and to the webdriver flag.
What the shipping build answers
All four placements are measured on our own engine, over every seed the run is given. The numbers below come from the run of 2 September.
Each is one line in the invariant harness. A build that answers otherwise is not accepted, and that rule is code rather than a habit, so a rebuild cannot quietly lose it.
One pixel through two windows
The same strip read twice through different rectangles comes back with the same bytes.
0 bytesThe mask does not carry over
Offsets learned from a solid fill do not transfer to a different drawing on any of the seeds.
0 of 7Two profiles draw apart
One picture drawn in two profiles gives two hashes, so the offsets are seeded rather than shared.
2 hashes
What our engine does
The offsets are applied where the pixels are made, not where they are handed back, and they come from the profile seed. That is why one profile is stable to itself while two profiles are unrelated.
Two runs of the same invariant harness: the build before the fingerprint patches, and the build shipping today. The harness is the same file in both columns.
| Measurement | Before, 25 Aug 2026 | Shipping, 2 Sep 2026 |
|---|---|---|
| One pixel read through two windows | 5 bytes differ | 0 bytes differ |
| Mask carried to another drawing | 7 of 7 | 0 of 7 |
| Seeds the run checked | 1 | 4 |
Often confused with
Blocking canvas
A browser that answers with a blank image is rarer than any particular drawing. Refusing turns into the identifying trait.
A fresh value per read
Two reads in one session that disagree are a contradiction inside one browser. Stability to itself is a requirement, not a shortcut.
Canvas fingerprint
The fingerprint is what a site computes, the noise is what moves it. Naming one for the other hides which side is being measured.
WebGL noise
The graphics surface is drawn by the card and read through its own calls. It is patched separately, and a fix on the canvas does not reach it.
How to check your own
The panel above shows the hash for the browser you are reading this in. The self-test lives in the app and runs inside a profile, against the engine that profile launched.
Four of its lines are about the canvas, and they are named in the block below. Each reports its own number rather than a verdict.
Run it in two profiles on one computer. Two hashes that differ is the reading worth having, and one run shows both.
What this does not do
- It does not hide the canvas. An empty image in reply is rarer than any hash and marks the browser at once.
- It does not give each site a different drawing. The seed belongs to the profile, and a value that shifts between two tabs of one session is itself a signal.
- It does not cover the other drawing surfaces on its own. WebGL and WebGPU are read through their own calls and are patched apart from this.
- It does not make a profile anonymous. Behaviour, address reputation and account history close more accounts than any drawing does.
Check it
Every number above comes from a file you can open.
- The four canvas checks the self-test runs
- apps/desktop/src/lib/fpAudit.js
- The two runs quoted above
- docs/замеры/приёмка-до-заплат-25-08.log · docs/замеры/приёмка-windows-02-09.log
- A build is not accepted until these hold
- engine/scripts/engine-invariants.js · engine/scripts/accept-engine.js
- Where the offsets are specified
- engine/patches/PATCHES.md
Questions
- Why not a fresh value on every read?
- Because two reads in one session that disagree are proof of tampering, not protection. The self-test checks that a repeated read of one rectangle comes back identical.
- Can two profiles draw the same canvas?
- The offsets come from the profile seed, so two profiles give two hashes. The acceptance run draws one picture in two profiles and records both values side by side.
- Is canvas noise enough on its own?
- No. A canvas that carries offsets next to a WebGL frame that does not is a disagreement inside one browser, and the run measures both paths for exactly that reason.
- Does a VPN or incognito change the drawing?
- Neither touches it. A VPN moves the address your traffic leaves from, incognito clears storage, and the picture is produced on your machine either way.
- How many seeds is a build checked against?
- The shipping run checked four, the earlier one a single seed. A defence that holds for one seed and fails on another is not yet a defence.
See what your own profile answers
The self-test runs inside a profile and reports every check by name, green and red alike.