Bu sayfa henüz sizin dilinizde yok. İngilizce metni okuyorsunuz.
Glossary
AudioContext fingerprint
An AudioContext fingerprint is an identifier a site builds from the numbers a browser returns after rendering a sound.
How a site takes it
The reading is silent by design. The sound is rendered into memory rather than sent anywhere, so there is nothing to hear and nothing to allow.
- 1
Renders a tone offline
A tone runs through a compressor in a context that never reaches the speakers.
- 2
Reads the samples back
The rendered channel comes back as an array of numbers the page reads directly.
- 3
Adds a slice of them up
That total is the fingerprint, and on an untouched machine it comes out the same every time.
What the total depends on
The number comes out of the sound stack rather than out of a setting. The compressor implementation, the rounding of very small values and the build all leave their mark on it.
That makes it coarse on its own and strong in company. It survives with nothing stored on your machine, so clearing storage does not move it and neither does a new window. A site needs one render and one sum, and that takes a fraction of a second.
Why one added offset is not enough
Adding the same small amount everywhere looks like protection and reads like a mark. One subtraction against a reference recovers both the amount and the places it was added.
A fixed step makes it worse. A mask learned from one sound then fits every other sound the page renders, and the defence becomes the trait that identifies the profile.
What our engine does
The shift is worked out for each sample from the profile seed, the position in the buffer and the bits of the sample itself. There is no step to find, the amount differs from place to place, and a mask taken off one sound does not fit another.
Silence is left alone, because a shifted nothing is visible. Reading the same buffer twice does not shift it again, so the total a page reads stays put however often it asks. The same work covers the other road out of the sound stack, the one that hands over frequency data rather than samples.
The shift is applied at all
The same tone rendered with no seed and with one gives two different totals.
Reading twice does not move it
Two totals taken one after the other in one profile come back identical.
There is no common step
The distances between shifted samples do not pile up on one value, which is what a period would look like.
There is no single amount
The differences at the shifted places are not one constant repeated down the buffer.
How to check your own
The self-test lives in the app and runs inside a profile. Its audio line renders the tone twice and reports the total together with whether the repeat matched.
The free check on this site shows a value for the browser you are reading this in. It is computed on the page and no request goes out with it.
Run the self-test in two profiles on one computer. Two totals where there is one sound stack is the reading worth having. The acceptance run takes the same reading in two profiles before a build ships and refuses the build if both come back with one total.
What this does not do
- It does not give each site a different total. The seed belongs to the profile, and a value that changes between two tabs of one session is itself a signal.
- It does not block the interface. A browser that refuses to render a sound is rarer than any particular total and marks itself at once, so the refusal costs more than the reading it avoids.
- It does not move with the proxy. The total follows the profile seed, so a profile that changes its exit address keeps the sound reading it had before.
- It does not make a profile anonymous. Behaviour, address reputation and account history close more accounts than a sound total does.
Check it
Everything above comes from a file you can open.
- The audio line the self-test runs
- apps/desktop/src/lib/fpAudit.js
- Where the seed for the shift comes from
- packages/shared/src/index.js
- Where the shift is put on the read path
- engine/patches/armanos-fp.cumulative.diff
- Measured in a real browser and in two profiles
- apps/desktop/test/audit-on-builtin.js · engine/scripts/accept-engine.js
Questions
- Can I hear anything while this happens?
- No. The tone is rendered in a context that never reaches the speakers, and the page reads numbers instead of playing them.
- Does muting the tab help?
- No. Volume is applied on the way to the speakers, and this reading never goes that way at all.
- Is my audio fingerprint unique to me?
- On its own, rarely. It is a coarse value that is strong because it combines with a dozen others, and the combination is what identifies a machine.
- Does a VPN change it?
- No. A VPN changes the address your traffic comes from. The sound is rendered on your machine and never travels through the network.
- Why not return a new number on every read?
- Because a total that moves between two reads of one page is itself the signal. A stable value that belongs to the profile is the one a real machine would give.
See what your own profile answers
The self-test runs inside a profile and reports all 29 measurements by name, green and red alike.