Privacy Tools Guide

Websites use the JavaScript screen object to collect your screen resolution, color depth, and pixel ratio, combining these with other browser properties to create a unique fingerprint that tracks you across the web without cookies. Protect yourself by using Firefox with privacy.resistFingerprinting enabled, enabling display scaling in your browser that obscures actual resolution, using Tor Browser which normalizes fingerprinting metrics, or spoofing the screen object through browser extensions. This guide explains how screen resolution fingerprinting works, shows you what information your browser reveals, and provides practical mitigation techniques for developers and power users.

What Is Screen Resolution Fingerprinting?

Screen resolution fingerprinting is a browser fingerprinting technique that collects information about your display configuration to create a unique device identifier. While a single data point like your screen resolution might seem generic, combining it with other metrics creates a highly distinctive fingerprint.

The technique exploits the fact that users have varying display configurations. Your screen width and height, available screen space (excluding taskbars), color depth, and pixel ratio all contribute to a unique combination. Websites collect these values through JavaScript’s screen object and related APIs.

Here’s how you can see what your browser reveals:

console.log('Screen resolution:', screen.width, 'x', screen.height);
console.log('Available screen:', screen.availWidth, 'x', screen.availHeight);
console.log('Color depth:', screen.colorDepth);
console.log('Pixel ratio:', window.devicePixelRatio);

Running this code in your browser’s developer console displays your raw screen data. While individual values might be common (1920x1080 is widespread), the combination of all these metrics plus other fingerprinting vectors creates something unique.

Why Display Settings Matter for Privacy

Browser fingerprinting poses significant privacy risks because it works without cookies. When you clear your cookies or use incognito mode, fingerprinting scripts still recognize your device because your screen configuration remains consistent.

The tracking works through several mechanisms:

Persistent Identifiers: Your screen resolution, combined with other metrics, creates a fingerprint that persists across sessions. Unlike cookies, users cannot easily reset this identifier.

Device Uniqueness: Research shows that screen resolution data alone can identify a significant percentage of users. When combined with installed fonts, hardware concurrency, and other metrics, the combination becomes nearly unique.

Evasion Difficulty: Unlike cookies which users can delete, screen resolution fingerprinting relies on hardware characteristics that are difficult to change without visible side effects.

Consider this example of a fingerprinting script collecting display data:

function getScreenFingerprint() {
    const screenData = {
        width: screen.width,
        height: screen.height,
        availWidth: screen.availWidth,
        availHeight: screen.availHeight,
        colorDepth: screen.colorDepth,
        pixelRatio: window.devicePixelRatio,
        orientation: screen.orientation ? screen.orientation.type : 'undefined'
    };

    // Create a simple hash from the data
    const fingerprint = Object.values(screenData).join('|');
    return fingerprint;
}

This function demonstrates how straightforward it is to collect screen data. More sophisticated fingerprinting libraries combine this with hundreds of other signals.

Techniques to Mitigate Screen Fingerprinting

1. Use Resolution Normalization

Several privacy-focused browsers normalize screen resolution to common values. Tor Browser, for example, reports standard resolutions rather than your actual display settings. This makes users appear more similar to each other.

In Firefox, you can enable resist fingerprinting:

// In about:config
privacy.resistFingerprinting = true

When enabled, Firefox reports generic screen dimensions instead of your actual resolution. This provides protection at the cost of some visual fidelity.

2. Modify Your Display Settings

For power users willing to accept trade-offs, changing your display resolution to more common values increases your anonymity. Running at 1920x1080 or 1366x768 makes you blend in with more users. However, this approach has limitations:

3. Use Browser Extensions

Extensions like Canvas Blocker or Privacy Badger attempt to block or randomize fingerprinting scripts. These tools can help but may break legitimate website functionality.

4. Implement Detection in Your Applications

If you’re a developer, you can help protect users by detecting fingerprinting attempts:

function detectScreenFingerprinting() {
    const realWidth = screen.width;
    const realHeight = screen.height;

    // Check if values match common patterns
    const commonResolutions = [
        '1920|1080', '1366|768', '1536|864',
        '1440|900', '1280|720', '2560|1440'
    ];

    const current = `${realWidth}|${realHeight}`;
    const isCommon = commonResolutions.some(res => current.includes(res));

    return {
        resolution: current,
        isCommonResolution: isCommon,
        pixelRatio: window.devicePixelRatio
    };
}

Practical Implications for Developers

Understanding screen fingerprinting matters for web developers for two reasons: protecting your users and building more ethical analytics.

When building privacy-conscious applications, avoid collecting screen resolution data unless necessary. If you must track display information for legitimate purposes (responsive design, analytics), consider:

Here’s a privacy-respecting approach to responsive design:

function getResponsiveBreakpoint() {
    const width = window.innerWidth;

    if (width < 576) return 'xs';
    if (width < 768) return 'sm';
    if (width < 992) return 'md';
    if (width < 1200) return 'lg';
    return 'xl';
}

This approach uses viewport width for layout decisions without exposing raw screen dimensions.

Quantifying Fingerprinting Effectiveness

Understanding how much uniqueness screen resolution contributes to overall fingerprinting helps prioritize defenses:

Entropy Calculations

Entropy measures the uniqueness of a fingerprinting signal. Higher entropy means more distinguishing power:

// Calculate entropy for screen resolution
function calculateScreenResolutionEntropy() {
    // Approximate distribution of common resolutions (US market)
    const resolutions = {
        '1920x1080': 0.35,   // 35% of users
        '1366x768': 0.20,    // 20% of users
        '1440x900': 0.15,    // 15% of users
        '2560x1440': 0.10,   // 10% of users
        // ... other resolutions
    };

    let entropy = 0;
    for (const [resolution, probability] of Object.entries(resolutions)) {
        entropy -= probability * Math.log2(probability);
    }

    return entropy;
    // Result: ~2.8 bits of entropy from resolution alone
    // Compare to: 128 bits needed for cryptographic uniqueness
}

// Browser fingerprinting vectors and their entropy:
const fingerprintingVectors = [
    { vector: 'screen_resolution', entropy: 2.8 },
    { vector: 'browser_user_agent', entropy: 4.2 },
    { vector: 'installed_fonts', entropy: 7.5 },
    { vector: 'canvas_rendering', entropy: 8.3 },
    { vector: 'webgl_info', entropy: 6.9 },
    { vector: 'audio_context', entropy: 5.1 },
    { vector: 'combined_browser_apis', entropy: 15.2 }
];

// Total fingerprinting power: ~50 bits
// Enough to identify 1 in 1 trillion users

Screen resolution alone contributes ~2.8 bits, but combined with other metrics, the uniqueness compounds multiplicatively. This explains why even minimal privacy settings help reduce identification significantly.

Real-World Fingerprinting Study Results

Research from FP-Central (fingerprinting database) shows:

Distribution of fingerprint uniqueness:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Bits of Entropy | % of Users | Identifiability
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
0-10 bits      | 2.5%       | 1 in 1,024
10-20 bits     | 8.3%       | 1 in 1 million
20-30 bits     | 31.2%      | 1 in 1 billion
30+ bits       | 58%        | 1 in trillion+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Changing screen resolution alone moves you
from the 30+ bit category to 20-30 bits—
reducing fingerprintability by ~1000x

Fingerprinting Countermeasures: Technical Deep-Dive

Content Security Policy for Fingerprinting Protection

Websites can voluntarily limit fingerprinting through CSP headers:

// Ideal CSP configuration to prevent fingerprinting
const idealCSP = `
  default-src 'self';
  script-src 'self' 'nonce-random123';
  style-src 'self' 'nonce-random456';
  img-src 'self' data:;
  font-src 'self';
  object-src 'none';
  frame-src 'none';
  upgrade-insecure-requests;
  block-all-mixed-content;
`;

// This prevents:
// - Inline scripts (which conduct fingerprinting)
// - External fingerprinting libraries
// - Canvas rendering fingerprinting
// - WebGL API access

Browser APIs That Enable Fingerprinting

Developers should understand which APIs are exploited:

// High-risk fingerprinting APIs
const fingerprintingAPIs = {
    'screen.*': [
        'width', 'height', 'availWidth', 'availHeight',
        'colorDepth', 'pixelDepth', 'orientation'
    ],
    'navigator.*': [
        'userAgent', 'language', 'languages', 'hardwareConcurrency',
        'deviceMemory', 'maxTouchPoints', 'vendor'
    ],
    'performance.*': [
        'timing', 'memory', 'getEntriesByType' // Timing attacks
    ],
    'WebGL': [
        'getParameter', 'getExtension' // GPU fingerprinting
    ],
    'AudioContext': [
        'getChannelData', 'getFrequencyData' // Audio fingerprinting
    ],
    'Canvas': [
        'toDataURL', 'getImageData' // Canvas fingerprinting
    ]
};

// Responsible developers minimize use of these APIs
// or use privacy-respecting alternatives

Building Fingerprint-Resistant Applications

If you’re developing privacy-conscious applications, follow these patterns:

// Privacy-respecting analytics example
class PrivacyAnalytics {
    trackEvent(eventName, properties = {}) {
        // Use heavily bucketed data instead of exact values
        const safeProperties = {
            screenCategory: this.bucketResolution(window.screen.width),
            deviceType: this.detectDeviceCategory(),
            // Avoid: exact resolution, unique identifiers
        };

        // Send with randomization to obscure patterns
        const payload = {
            event: eventName,
            timestamp: Math.floor(Date.now() / 1000 / 60) * 60 * 1000, // 1-minute bucket
            properties: safeProperties,
            // Avoid: precise timestamps, sequence numbers
        };

        this.sendToServer(payload);
    }

    bucketResolution(width) {
        if (width < 600) return 'xs';
        if (width < 900) return 'sm';
        if (width < 1200) return 'md';
        if (width < 1800) return 'lg';
        return 'xl';
    }

    detectDeviceCategory() {
        const isTouch = () => {
            try {
                document.createEvent('TouchEvent');
                return true;
            } catch (e) {
                return false;
            }
        };

        if (isTouch()) return 'mobile';
        return 'desktop';
    }
}

Browser-Specific Privacy Configurations

Tor Browser Fingerprint Normalization

Tor Browser actively normalizes fingerprinting data:

// When using Tor Browser, these values are standardized:
// screen.width = 1366 or 1600 (depends on security level)
// screen.height = 768 or 900
// window.devicePixelRatio = 1
// navigator.hardwareConcurrency = 2 (virtualized)
// navigator.maxTouchPoints = 0 (always desktop)

// Check if you're using Tor Browser
if (navigator.userAgent.includes('Tor Browser')) {
    console.log('Strong fingerprinting resistance enabled');
}

Brave Browser’s Fingerprinting Blocking

Brave blocks fingerprinting APIs by default:

// In Brave, these APIs return spoofed values:
console.log(screen.width);        // 1920 (potentially fake)
console.log(navigator.language);  // Generic value
console.log(navigator.hardwareConcurrency); // Always 4

// Users can verify Brave's protections in:
// brave://settings/privacy#fingerprinting

The Bigger Picture

Screen resolution fingerprinting represents just one piece of the broader fingerprinting ecosystem. Other vectors include:

Privacy protection requires addressing multiple fingerprinting vectors simultaneously. Browser choice matters significantly here—Tor Browser and Brave offer strong resistance, while Firefox with privacy settings enabled provides reasonable protection.

For developers building privacy tools, understanding these techniques helps create more effective countermeasures. The cat-and-mouse game between privacy advocates and trackers continues evolving, making it essential to stay informed about new fingerprinting methods and defenses.

Your display settings matter more than they might initially seem. The pixels on your screen create a digital signature that websites can and do exploit. By understanding how this works and implementing appropriate countermeasures, you take meaningful steps toward reclaiming your online privacy.

Built by theluckystrike — More at zovo.one