Security

Fingerprint Spoofing

Fingerprint spoofing is the practice of modifying browser and device characteristics to mask your true digital identity, preventing websites from tracking and identifying you through browser fingerprinting techniques.

What is Fingerprint Spoofing?

Fingerprint spoofing is the technique of altering or randomizing the unique characteristics that websites collect to create a digital fingerprint of your browser and device. By spoofing these attributes, users can prevent tracking, bypass anti-bot systems, and maintain privacy across multiple browsing sessions.

Browser Fingerprinting

What Gets Fingerprinted

interface BrowserFingerprint {
  basic: {
    userAgent: 'Browser name, version, OS';
    language: 'Preferred languages';
    timezone: 'System timezone';
    screenResolution: 'Monitor dimensions';
    colorDepth: 'Display color capability';
    platform: 'Operating system';
  };
  advanced: {
    canvas: 'Canvas rendering variations';
    webgl: 'GPU and graphics driver info';
    audio: 'Audio context fingerprinting';
    fonts: 'Installed system fonts';
    plugins: 'Browser plugins list';
    hardware: 'CPU cores, memory, battery';
  };
  tracking: {
    cookies: 'Persistent identifiers';
    localStorage: 'Stored data';
    doNotTrack: 'DNT header setting';
    touchSupport: 'Touch capability detection';
    permissions: 'Granted browser permissions';
  };
}

Fingerprint Uniqueness

interface FingerprintUniqueness {
  statistic: '87% of browsers can be uniquely identified';
  entropy: 'Average 18.1 bits of identifying information';
  persistence: 'Fingerprints remain stable for weeks/months';
  tracking: 'Can track users across incognito mode, VPN changes';
}

Fingerprint Spoofing Techniques

User Agent Spoofing

interface UserAgentSpoofing {
  real: 'Mozilla/5.0 (X11; Linux x86_64) Chrome/120.0.0.0';
  spoofed: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0';
}

// Spoof User Agent with Fetch API
async function fetchWithSpoofedUA(url: string) {
  const spoofedUA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36';

  const response = await fetch(
    `https://corsproxy.io/?url=${encodeURIComponent(url)}`,
    {
      headers: {
        'User-Agent': spoofedUA,
        'x-cors-api-key': 'your-api-key'
      }
    }
  );

  return response.json();
}

// Browser extension approach
if (typeof chrome !== 'undefined' && chrome.webRequest) {
  chrome.webRequest.onBeforeSendHeaders.addListener(
    (details) => {
      const headers = details.requestHeaders || [];

      // Replace User-Agent header
      const uaIndex = headers.findIndex(h => h.name.toLowerCase() === 'user-agent');
      if (uaIndex !== -1) {
        headers[uaIndex].value = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36';
      }

      return { requestHeaders: headers };
    },
    { urls: ['<all_urls>'] },
    ['blocking', 'requestHeaders']
  );
}

Canvas Fingerprint Spoofing

interface CanvasFingerprinting {
  technique: 'Websites render hidden text/shapes on canvas';
  uniqueness: 'GPU/driver differences create unique renderings';
  tracking: 'Hash of canvas data identifies specific machine';
}

// Canvas spoofing technique
function spoofCanvas() {
  const originalToDataURL = HTMLCanvasElement.prototype.toDataURL;
  const originalGetImageData = CanvasRenderingContext2D.prototype.getImageData;

  // Add noise to canvas data
  HTMLCanvasElement.prototype.toDataURL = function (type?: string) {
    const context = this.getContext('2d');
    if (context) {
      const imageData = context.getImageData(0, 0, this.width, this.height);
      const data = imageData.data;

      // Add random noise to pixel data (subtle)
      for (let i = 0; i < data.length; i += 4) {
        if (Math.random() < 0.001) { // Modify 0.1% of pixels
          data[i] = data[i] ^ Math.floor(Math.random() * 10); // Red
          data[i + 1] = data[i + 1] ^ Math.floor(Math.random() * 10); // Green
          data[i + 2] = data[i + 2] ^ Math.floor(Math.random() * 10); // Blue
        }
      }

      context.putImageData(imageData, 0, 0);
    }

    return originalToDataURL.apply(this, [type]);
  };

  // Spoof getImageData
  CanvasRenderingContext2D.prototype.getImageData = function (...args) {
    const imageData = originalGetImageData.apply(this, args);
    const data = imageData.data;

    // Add consistent but random noise
    for (let i = 0; i < data.length; i += 4) {
      data[i] = (data[i] + 1) % 256; // Slight modification
    }

    return imageData;
  };
}

// Initialize spoofing before any tracking scripts load
spoofCanvas();

WebGL Fingerprint Spoofing

interface WebGLFingerprint {
  vendor: 'GPU vendor (e.g., "NVIDIA Corporation")';
  renderer: 'GPU model (e.g., "NVIDIA GeForce RTX 3080")';
  parameters: 'WebGL parameters and extensions';
  uniqueness: 'Very distinctive, hard to spoof';
}

function spoofWebGL() {
  const getParameter = WebGLRenderingContext.prototype.getParameter;
  const getExtension = WebGLRenderingContext.prototype.getExtension;

  // Spoof GPU info
  WebGLRenderingContext.prototype.getParameter = function (parameter: number) {
    // UNMASKED_VENDOR_WEBGL
    if (parameter === 37445) {
      return 'Intel Inc.'; // Spoofed vendor
    }
    // UNMASKED_RENDERER_WEBGL
    if (parameter === 37446) {
      return 'Intel Iris OpenGL Engine'; // Spoofed renderer
    }
    return getParameter.call(this, parameter);
  };

  // Spoof extensions
  WebGLRenderingContext.prototype.getExtension = function (name: string) {
    // Block fingerprinting extensions
    if (name === 'WEBGL_debug_renderer_info') {
      return null;
    }
    return getExtension.call(this, name);
  };
}

spoofWebGL();

Audio Context Spoofing

interface AudioFingerprint {
  method: 'Analyze audio processing variations';
  uniqueness: 'Hardware/software audio stack creates unique signatures';
  detection: 'Generate and analyze audio waveforms';
}

function spoofAudioContext() {
  const AudioContext = window.AudioContext || (window as any).webkitAudioContext;

  if (!AudioContext) return;

  const originalCreateBuffer = AudioContext.prototype.createBuffer;

  AudioContext.prototype.createBuffer = function (...args) {
    const buffer = originalCreateBuffer.apply(this, args);
    const channelData = buffer.getChannelData(0);

    // Add noise to audio buffer
    for (let i = 0; i < channelData.length; i++) {
      channelData[i] += (Math.random() - 0.5) * 0.0001;
    }

    return buffer;
  };
}

spoofAudioContext();

Complete Fingerprint Spoofing System

Comprehensive Spoofing

interface FingerprintSpoofingProfile {
  userAgent: string;
  platform: string;
  vendor: string;
  language: string;
  languages: string[];
  timezone: number;
  screen: {
    width: number;
    height: number;
    colorDepth: number;
  };
  webgl: {
    vendor: string;
    renderer: string;
  };
  fonts: string[];
}

class FingerprintSpoofer {
  private profile: FingerprintSpoofingProfile;

  constructor() {
    this.profile = this.generateProfile();
    this.applyProfile();
  }

  private generateProfile(): FingerprintSpoofingProfile {
    const profiles = [
      {
        userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0',
        platform: 'Win32',
        vendor: 'Google Inc.',
        language: 'en-US',
        languages: ['en-US', 'en'],
        timezone: -5,
        screen: { width: 1920, height: 1080, colorDepth: 24 },
        webgl: { vendor: 'Intel Inc.', renderer: 'Intel UHD Graphics 630' },
        fonts: ['Arial', 'Calibri', 'Cambria', 'Times New Roman']
      },
      {
        userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/605.1.15',
        platform: 'MacIntel',
        vendor: 'Apple Computer, Inc.',
        language: 'en-US',
        languages: ['en-US', 'en'],
        timezone: -8,
        screen: { width: 2560, height: 1440, colorDepth: 24 },
        webgl: { vendor: 'Apple Inc.', renderer: 'Apple M1' },
        fonts: ['Arial', 'Helvetica', 'San Francisco', 'Times']
      }
    ];

    return profiles[Math.floor(Math.random() * profiles.length)];
  }

  private applyProfile() {
    this.spoofNavigator();
    this.spoofScreen();
    this.spoofLanguages();
    this.spoofTimezone();
    spoofCanvas();
    spoofWebGL();
    spoofAudioContext();
  }

  private spoofNavigator() {
    Object.defineProperty(navigator, 'userAgent', {
      get: () => this.profile.userAgent
    });

    Object.defineProperty(navigator, 'platform', {
      get: () => this.profile.platform
    });

    Object.defineProperty(navigator, 'vendor', {
      get: () => this.profile.vendor
    });

    Object.defineProperty(navigator, 'hardwareConcurrency', {
      get: () => 4 + Math.floor(Math.random() * 8) // Random 4-12 cores
    });

    Object.defineProperty(navigator, 'deviceMemory', {
      get: () => 8 // Fixed at 8GB
    });
  }

  private spoofScreen() {
    Object.defineProperty(screen, 'width', {
      get: () => this.profile.screen.width
    });

    Object.defineProperty(screen, 'height', {
      get: () => this.profile.screen.height
    });

    Object.defineProperty(screen, 'colorDepth', {
      get: () => this.profile.screen.colorDepth
    });
  }

  private spoofLanguages() {
    Object.defineProperty(navigator, 'language', {
      get: () => this.profile.language
    });

    Object.defineProperty(navigator, 'languages', {
      get: () => this.profile.languages
    });
  }

  private spoofTimezone() {
    const originalGetTimezoneOffset = Date.prototype.getTimezoneOffset;

    Date.prototype.getTimezoneOffset = function () {
      return this.profile.timezone * 60; // Convert hours to minutes
    }.bind(this);
  }

  getProfile(): FingerprintSpoofingProfile {
    return { ...this.profile };
  }
}

// Initialize spoofing
const spoofer = new FingerprintSpoofer();
console.log('Spoofed profile:', spoofer.getProfile());

Proxy + Fingerprint Spoofing

Combined Approach

interface CompleteSpoofing {
  network: 'Proxy/VPN for IP masking';
  fingerprint: 'Browser fingerprint spoofing';
  combined: 'Maximum anonymity and anti-detection';
}

async function fetchWithFullSpoofing(url: string, apiKey: string) {
  // Apply fingerprint spoofing
  const spoofer = new FingerprintSpoofer();
  const profile = spoofer.getProfile();

  // Use proxy with spoofed fingerprint
  const response = await fetch(
    `https://corsproxy.io/?url=${encodeURIComponent(url)}`,
    {
      headers: {
        'User-Agent': profile.userAgent,
        'Accept-Language': profile.languages.join(','),
        'x-cors-api-key': apiKey
      }
    }
  );

  return response.json();
}

// Usage
const data = await fetchWithFullSpoofing('https://api.example.com/data', 'api-key');

Fingerprint Testing

Detection Check

class FingerprintTester {
  async testFingerprint(): Promise<{
    uniqueness: number;
    detected: string[];
    recommendation: string;
  }> {
    const detected: string[] = [];

    // Check for common fingerprinting APIs
    if ('permissions' in navigator) {
      detected.push('Permissions API');
    }

    if ('deviceMemory' in navigator) {
      detected.push('Device Memory');
    }

    if ('hardwareConcurrency' in navigator) {
      detected.push('CPU Cores');
    }

    // Check Canvas fingerprinting
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    if (ctx) {
      ctx.textBaseline = 'top';
      ctx.font = '14px Arial';
      ctx.fillText('Fingerprint test', 2, 2);
      const canvasData = canvas.toDataURL();
      detected.push('Canvas Fingerprinting');
    }

    // Check WebGL
    const webgl = document.createElement('canvas').getContext('webgl');
    if (webgl) {
      detected.push('WebGL Fingerprinting');
    }

    // Uniqueness score (simplified)
    const uniqueness = detected.length * 10;

    return {
      uniqueness,
      detected,
      recommendation: uniqueness > 50
        ? 'Highly fingerprintable - consider spoofing'
        : 'Low fingerprintability'
    };
  }
}

// Test current fingerprint
const tester = new FingerprintTester();
const result = await tester.testFingerprint();
console.log('Fingerprint test:', result);

Anti-Detect Browsers

Specialized Tools

interface AntiDetectBrowsers {
  multilogin: {
    features: 'Multiple browser profiles with unique fingerprints';
    spoofing: 'Canvas, WebGL, Audio, Fonts, Geolocation';
    platforms: 'Windows, macOS';
    cost: '$99+/month';
  };
  gologin: {
    features: 'Cloud-based browser profiles';
    spoofing: 'Comprehensive fingerprint management';
    platforms: 'Web-based, Desktop apps';
    cost: '$24+/month';
  };
  adspower: {
    features: 'Profile management for e-commerce/marketing';
    spoofing: 'Full fingerprint control';
    platforms: 'Windows, macOS';
    cost: '$9+/month';
  };
}

Best Practices

Effective Spoofing

interface SpoofingBestPractices {
  consistency: {
    rule: 'Keep spoofed values consistent across session';
    reason: 'Changing values mid-session triggers detection';
    example: 'Same userAgent + screen size throughout';
  };
  realism: {
    rule: 'Use realistic combinations';
    reason: 'Impossible combinations get flagged';
    example: 'Windows + Safari = suspicious';
  };
  rotation: {
    rule: 'Rotate profiles between sessions';
    reason: 'Prevents long-term tracking';
    example: 'New profile every 24 hours';
  };
  testing: {
    rule: 'Test fingerprint uniqueness';
    tools: ['https://amiunique.org', 'https://browserleaks.com'];
    verify: 'Check if spoofing is effective';
  };
}

Detection Evasion

Anti-Bot Systems

interface EvasionTechniques {
  behavioral: {
    mouseMovement: 'Simulate human-like mouse movements';
    typing: 'Add random delays between keystrokes';
    scrolling: 'Smooth scrolling with natural pauses';
  };
  technical: {
    headless: 'Avoid headless browser detection';
    automation: 'Hide Selenium/Puppeteer indicators';
    timing: 'Random delays between actions';
  };
  fingerprint: {
    rotation: 'Change fingerprint per session';
    consistency: 'Match all attributes (UA, platform, etc.)';
    noise: 'Add subtle randomness to canvas/audio';
  };
}

Learn More

Create a free Account to fix CORS Errors in Production

Say goodbye to CORS errors and get back to building great web applications. It's free!

CORSPROXY Dashboard

Related Terms

More in Security

Related guides

Back to Glossary