← Back to Code

User Fingerprinting

Why Canvas Fingerprinting Works

Browser fingerprinting generates unique user identifiers without cookies. Canvas rendering produces device-specific signatures based on hardware and software differences.

Canvas Fingerprint Implementation

// Generate unique browser fingerprint async function createCanvasFingerprint() { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); // Draw unique pattern that renders differently per device ctx.textBaseline = 'top'; ctx.font = '16px serif'; ctx.fillStyle = '#f60'; ctx.fillRect(10, 10, 100, 100); ctx.fillStyle = '#069'; ctx.arc(50, 50, 20, 0, Math.PI * 2); ctx.fill(); ctx.fillStyle = '#333'; ctx.fillText('Test', 20, 20); return canvas.toDataURL(); }

Browser Variation Sources

Canvas rendering differs between devices due to:

Complete Fingerprinting System

// Combine multiple data points for 99.5% uniqueness const fingerprint = { canvas: canvas.toDataURL(), screen: `${screen.width}x${screen.height}x${screen.colorDepth}`, timezone: new Date().getTimezoneOffset(), language: navigator.language, platform: navigator.platform, cores: navigator.hardwareConcurrency || 4, memory: navigator.deviceMemory || 4, connection: navigator.connection?.effectiveType || 'unknown' };

Privacy-Compliant Persistence

// Store user data locally without server tracking const userData = { fingerprint: generateFingerprint(), visits: parseInt(localStorage.getItem('visits') || '0') + 1, preferences: JSON.parse(localStorage.getItem('preferences') || '{}'), lastVisit: Date.now() }; localStorage.setItem('userData', JSON.stringify(userData));

Real-World Applications

Implementation Benefits

No server required. No database calls. No privacy violations. Users return months later and the system recognizes them instantly.

Built for: This portfolio website's magic user system. Demonstrates invisible user tracking that enhances experience without intrusion.