Skip to main content

Device Fingerprinting

The ShieldLabs JS snippet collects over 30 browser parameters to build a device fingerprint. The fingerprint is hashed into a DeviceID and used to detect multi-accounting, detect anti-detect browsers, and identify returning devices.

What is collected

Browser rendering

ParameterHow collected
canvasCanvas 2D geometry, text, and winding test
webGlBasicsWebGL vendor, renderer string, version
webGlExtensionsList of supported WebGL extensions
audioOfflineAudioContext fingerprint
fontsAvailable system fonts (via CSS measurement)
fontPreferencesRendered font sizes across font families

Hardware & display

ParameterSource
screenResolutionscreen.width × screen.height
screenFramescreen.availTop/Right/Bottom/Left
colorDepthscreen.colorDepth
colorGamutrec2020 / p3 / srgb
deviceMemorynavigator.deviceMemory
hardwareConcurrencynavigator.hardwareConcurrency (CPU threads)
architectureCPU architecture bits

Browser environment

ParameterSource
platformnavigator.platform
vendornavigator.vendor
vendorFlavorsBrowser type flags (chrome, safari, etc.)
pluginsnavigator.plugins
languagesnavigator.languages
timezoneIntl.DateTimeFormat().resolvedOptions().timeZone
cpuClassnavigator.cpuClass (IE legacy)
osCpunavigator.oscpu

Storage & APIs

ParameterChecks
sessionStoragewindow.sessionStorage available
localStoragewindow.localStorage available
indexedDBwindow.indexedDB available
openDatabaseWebSQL available
cookiesEnablednavigator.cookieEnabled
pdfViewerEnabledPDF viewer plugin

Media & accessibility

ParameterChecks
touchSupportmaxTouchPoints, touch events
invertedColorsprefers-color-scheme: inverted
forcedColorsForced colors mode active
monochromeMonochrome display bits
contrastprefers-contrast
reducedMotionprefers-reduced-motion
reducedTransparencyprefers-reduced-transparency
hdrHDR display support
applePayApple Pay API available
audioBaseLatencyAudioContext.baseLatency

How DeviceID is computed

All collected parameters are serialized into a stable string and hashed:
DeviceID = MurmurHash3_x64_128(serialize(components))
The result is a 32-character hexadecimal string. MurmurHash3 x64 128-bit is used for its speed and low collision rate.

What fingerprinting detects

Anti-detect browsers

Anti-detect browsers (Multilogin, AdsPower, Incogniton, etc.) randomize canvas, WebGL, and UA parameters to avoid fingerprinting. ShieldLabs catches these by:
  1. TCP OS fingerprinting: the OS reported by the User-Agent is compared against the TCP stack fingerprint (TTL, MSS, window size). You cannot fake the TCP stack — only the OS kernel controls it.
  2. WebGL entropy: heavily randomized WebGL parameters have characteristic entropy signatures.
  3. Missing APIs: anti-detect profiles often have inconsistent plugin/API availability.

Headless browsers

Puppeteer, Playwright, and other headless browsers expose themselves through:
  • No canvas/WebGL renderer (or generic strings like SwiftShader)
  • Missing audio context support
  • No system fonts
  • navigator.webdriver = true (easily detected)
  • Missing STUN/ICE support → Stun is not checked signal

Privacy browsers

Brave, Firefox with anti-fingerprinting, and Safari ITP:
  • Generate lower but non-zero DeviceIDs (fingerprinting is partially blocked)
  • Typically don’t trigger OS mismatch signals (real OS is preserved)
  • Score lower than anti-detect browsers

Privacy

ShieldLabs does not collect PII. The following data is explicitly excluded:
  • No raw IP (only sent server-side from TCP layer)
  • No email, name, or user data
  • No cookies
  • No browsing history
The UserHID you pass must be a hash of your user’s identifier, not the raw value.