Privacy Tools Guide

Browser fingerprinting has evolved into one of the most sophisticated tracking techniques on the web. Unlike cookies, which you can delete, browser fingerprints are generated from the unique combination of your browser configuration, hardware, and system settings. Understanding your uniqueness score helps you assess how identifiable you are online.

This guide covers practical methods to check your browser fingerprint uniqueness score using online tools, with code examples for developers who want to build custom fingerprinting tests.

What Is Browser Fingerprint Uniqueness?

Every browser exposes dozens of attributes when visiting websites. These include user agent strings, screen resolution, installed fonts, GPU renderer, timezone, language preferences, and more. When combined, these attributes create a digital fingerprint.

Your uniqueness score represents how rare your browser configuration is compared to other users. A higher uniqueness score means you’re easier to identify and track across websites—even without cookies or login accounts. Scores above 99% indicate your browser is extremely identifiable.

Key Fingerprinting Vectors

Before testing, understand which attributes contribute most to your fingerprint:

Hardware and System

Browser Configuration

Behavioral Signals

Using Online Fingerprinting Tools

EFF Cover Your Tracks

The Electronic Frontier Foundation’s Cover Your Tracks tool (formerly Panopticlick) remains the gold standard for fingerprint testing. It analyzes your browser’s exposed attributes and calculates an entropy score.

The tool measures:

Visit the site and click the “Test Your Browser” button. The results show your entropy score and whether your browser stands out.

AmIUnique Project

AmIUnique is a European research project that collects fingerprint data to study tracking. Their tool compares your fingerprint against their database of millions of collected fingerprints.

The service provides:

BrowserLeaks

BrowserLeaks offers testing across multiple fingerprinting vectors including canvas, WebGL, audio context, and WebGL2. This tool is particularly useful for developers because it shows exactly what each API reveals.

Building a Custom Fingerprint Tester

For developers who want deeper control, build your own fingerprint collector:

class FingerprintCollector {
  constructor() {
    this.data = {};
  }

  async collect() {
    await this.collectNavigator();
    this.collectScreen();
    this.collectWebGL();
    this.collectCanvas();
    await this.collectWebRTC();
    return this.generateHash();
  }

  async collectNavigator() {
    const nav = navigator;
    this.data = {
      userAgent: nav.userAgent,
      platform: nav.platform,
      language: nav.language,
      languages: nav.languages,
      hardwareConcurrency: nav.hardwareConcurrency,
      deviceMemory: nav.deviceMemory,
      cookieEnabled: nav.cookieEnabled,
      doNotTrack: nav.doNotTrack,
      timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
    };
  }

  collectScreen() {
    this.data.screen = {
      width: screen.width,
      height: screen.height,
      availWidth: screen.availWidth,
      availHeight: screen.availHeight,
      colorDepth: screen.colorDepth,
      pixelRatio: window.devicePixelRatio
    };
  }

  collectWebGL() {
    const canvas = document.createElement('canvas');
    const gl = canvas.getContext('webgl');

    if (!gl) {
      this.data.webgl = { error: 'WebGL not supported' };
      return;
    }

    const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
    if (debugInfo) {
      this.data.webgl = {
        vendor: gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL),
        renderer: gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL)
      };
    }
  }

  collectCanvas() {
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');

    canvas.width = 200;
    canvas.height = 50;

    ctx.textBaseline = 'top';
    ctx.font = '14px Arial';
    ctx.fillStyle = '#f60';
    ctx.fillRect(125, 1, 62, 20);
    ctx.fillStyle = '#069';
    ctx.fillText('Test', 2, 15);
    ctx.fillStyle = 'rgba(102, 204, 0, 0.7)';
    ctx.fillText('Test', 4, 17);

    this.data.canvasHash = this.hashCode(canvas.toDataURL());
  }

  hashCode(str) {
    let hash = 0;
    for (let i = 0; i < str.length; i++) {
      const char = str.charCodeAt(i);
      hash = ((hash << 5) - hash) + char;
      hash = hash & hash;
    }
    return hash;
  }

  generateHash() {
    const combined = JSON.stringify(this.data);
    return this.hashCode(combined);
  }
}

// Usage
const collector = new FingerprintCollector();
collector.collect().then(fingerprint => {
  console.log('Fingerprint:', fingerprint);
  console.log('Data:', collector.data);
});

This collector gathers the most significant fingerprinting vectors and generates a hash you can use for comparison.

Calculating Your Uniqueness Score

To calculate an uniqueness score, you need a reference dataset. The simplest approach compares your fingerprint against a sample population:

function calculateUniquenessScore(yourFingerprint, referenceDataset) {
  let matches = 0;
  const total = referenceDataset.length;

  for (const fp of referenceDataset) {
    if (fp.hash === yourFingerprint.hash) {
      matches++;
    }
  }

  // Calculate uniqueness as percentage
  // Lower matches = Higher uniqueness
  const uniqueness = ((total - matches) / total) * 100;
  return uniqueness.toFixed(2);
}

In practice, reference datasets from projects like AmIUnique contain millions of fingerprints. For accurate scores, use their online tools rather than building your own comparison database.

Interpreting Your Results

After testing, you’ll receive an uniqueness score. Here’s how to interpret the results:

Below 10%: Your browser blends in well. You’re difficult to track using fingerprinting alone.

10-50%: Some identifying features, but not uniquely distinguishable.

50-90%: Moderately unique. Advertisers can likely track you across sites.

Above 90%: Highly identifiable. Your browser configuration stands out significantly.

Above 99%: Extremely unique. You can be fingerprinted and tracked reliably without any cookies.

Hardening Your Browser

Once you know your score, take steps to reduce your uniqueness:

Use Privacy-Focused Browsers

Firefox Configuration Set privacy.resistFingerprinting = true in about:config to normalize many exposed values.

Disable WebGL if you don’t need it, as it reveals GPU information.

Use common screen resolutions rather than maximizing windows on unusual monitor sizes.

Limit installed extensions as they add to your fingerprint.

Built by theluckystrike — More at zovo.one