NimbusX
00
› page loaded
← blog
fingerprint08.08.20269 min

How fingerprint checks connect profiles

Antifraud systems combine browser measurements into a fingerprint that can outlast cookies and IP changes. This guide explains the most distinctive signals and why changing Canvas alone is not enough.

01A fingerprint, not a cookie

A website sees a collection of measurements, not one browser label. Each signal is weak on its own; together they form a fingerprint that survives cleared cookies and a new IP address. The main signals are:

ChannelWhat is being measuredTypical distinguishing value
List of fontswhat fonts are installed on the systemhighest entropy: 9.45 bits, 35% of machines are unique
WebGLvideo card line, rendering parametershigh, hardware-dependent
Canvashash of the rendered imagehigh
Audiosignal hash via Web Audiohigh on different machines
Screen and DPRresolution and pixel densityaverage
Time zone, languagesystem settingslow individually, consistency is important

Fonts come first because they carried the most entropy in our measurements. The installed-font list alone made 35% of machines unique in the sample.

02Our baseline measurement

Our first measurement exposed a serious issue. Two profiles on one machine without separate device sets produced identical results on font metrics, WebGL parameters, clientRects and audio in every configuration. A website could link those accounts regardless of cookies or IP address. That result shaped the product architecture.

The answer was a coherent device configuration taken from a real computer, not arbitrary noise. Once each profile received its own device set, the same signals became distinct. We verified the result in live browsers:

SurfaceVaries between the two profiles
WebGL vendor and rendererYes
Parameters WebGLYes
Screen geometry and DPRYes
Number of cores and memoryYes
List of fontsYes
Speech synthesis voicesYes
Web Audio Constant TableYes
Canvasyes, the noise is from the profile seed

03Why replacing canvas alone is not enough

Changing Canvas while leaving the real font list untouched does not prevent linking: the remaining signals still match. Some signals should not be altered at all.

The engine deliberately leaves common-font text metrics unchanged. Detectors use measuretext-grid, which is designed to detect distortion; changing the value would expose the browser. The same applies to clientRects (see bcr-vs-range). These signals are not expected to differ: on two physical machines with the same OS and DPR, Arial has the same width because the font file and system define it.

A test that initially pointed in the wrong direction. The first version of our test measured the widths of eighteen common fonts and always found a match. It looked as if the device set did not work. In fact, machines differ by their list of installed fonts, not the metrics of fonts they share. After we corrected the test, the result reversed: profile B sees its three exclusive fonts, while profile A sees none of them.

04How to check it yourself

Verify it yourself. Create two profiles on the free plan, open the test page in each one and compare the raw values:

$ python -m app.cli profile create --name link-a $ python -m app.cli profile create --name link-b # open both profiles and visit nimbusx.app/check

Canvas and WebGL differ, while the profile signals remain coherent. You can verify that in the raw values, not in our description. Or open the fingerprint test: it measures your browser and places a NimbusX profile next to it for comparison.

05Remaining shared signals

One signal still links profiles running on the same machine: the rendered-audio hash. Engine noise varies by domain, not by profile. Two physical computers produce different hashes, but profiles on the same machine currently share one. The dashboard shows this openly in each profile's AUD cell. Until NimbusX ships its own engine build, keep profiles for the same platform on separate machines.

06Read more

Audio fingerprints and device signals · Consistency matters more than variety

Download NimbusXTechnical question: @Get_NimbusX_Bot