Eine technische Analyse von Hardware-, Verhaltens- und inhärenten Browser-Signalen, die auf Netzwerkebene nicht gespooft werden können
Obscura Forschung – Juli 2026
Zusammenfassung
Netzwerkebenen-Datenschutztools wie Obscura können HTTP-Header, TLS-Fingerprints, DNS-Abfragen und JavaScript-zugängliche Browser-Eigenschaften effektiv spoofen. Eine bedeutende Klasse von Fingerprinting-Vektoren operiert jedoch unterhalb, oberhalb oder außerhalb der Reichweite des Proxys. Diese Vektoren leiten sich von physikalischen Hardware-Eigenschaften, Browser-Implementierungsdetails, Benutzerverhaltensmustern und der inhärenten Asymmetrie des Erkennungswettrüstens ab.
Dieses Papier katalogisiert diese unkontrollierbaren Vektoren, analysiert ihre Stärken und Schwächen aus Angreiferperspektive und schlägt Abschwächungsstrategien vor – sowohl innerhalb von Obscuras Umfang als auch durch komplementäre Tools.
1. Einleitung
1.1 Die Proxy-Lücke
Obscura operiert auf den OSI-Schichten 3-7 (Netzwerk bis Anwendung). Signale, die ihren Ursprung haben bei:
- Schicht 0-2 (physische Hardware, GPU, Audio-Chip, CPU)
- Schicht 7+ (Browser-Rendering-Engine, Benutzerverhalten)
- Schichtübergreifende Inkonsistenzen (Abweichungen zwischen gespooften und nicht gespooften Signalen)
...liegen außerhalb der direkten Kontrolle des Proxys.
1.2 Klassifikation
| Kategorie | Vektoren | Ursache | Proxy-Einfluss |
|---|---|---|---|
| GPU/Hardware | Canvas, WebGL, WebGPU-Rendering | Physische Rendering-Pipeline | Keiner |
| Audio-Hardware | AudioContext, Latenz | Audio-DSP, Treiber | Keiner |
| CPU/Plattform | Mathe-Präzision, Wasm-Features, SIMD | Mikroarchitektur | Keiner |
| Browser-inhärent | Feature-Unterstützung, CSS-Media, Bugs, Eigenarten | Engine-Implementierung | Keiner (nur DNS-Blockierung) |
| Verhalten | Maus, Tastatur, Scroll, Timing | Benutzer | Keiner |
| Netzwerk-Residual | TCP/IP, Clock Skew, RTT | OS/Container-Stack | Teilweise |
| Schichtübergreifend | Profil-Inkonsistenz, Erkennungsheuristiken | Logik | Indirekt |
1.3 Das Asymmetrie-Problem
Die grundlegende Asymmetrie: der Fingerprinting-Dienst benötigt nur einen erfolgreichen Vektor, um einen Benutzer zu identifizieren oder zu korrelieren. Der Verteidiger muss alle Vektoren blockieren.
Dieses Papier erhebt nicht den Anspruch, diese Asymmetrie zu lösen. Es dokumentiert das Restrisiko.
2. GPU- & Rendering-Pipeline-Fingerprinting
Vollständiges Dokument: gpu-rendering.md
2.1 Warum es funktioniert
Die GPU-Rendering-Pipeline ist physisch deterministisch – die gleiche Eingabe erzeugt auf der gleichen Hardware immer die gleiche Ausgabe. Unterschiede entstehen durch:
- GPU-Mikroarchitektur (ALU-Anzahl, Rasterizer-Einheiten, TMUs, ROPs)
- Treiberversion und Compiler-Optimierungen
- Gleitkomma-Präzisionsunterschiede in Shadern
- Anti-Aliasing-Algorithmen
- Subpixel-Rendering-Reihenfolge (RGB vs. BGR)
- Farbraumkonvertierungsmatrizen
2.2 Vektoren
| Vektor | Entropie | Erkennbar wenn blockiert |
|---|---|---|
Canvas toDataURL()-Hash |
~5-7 Bits | Ja |
WEBGL_debug_renderer_info.UNMASKED_RENDERER |
~20 Bits (genaues GPU-Modell) | Ja |
| WebGL-Szenen-Render-Hash | ~10-15 Bits | Ja |
WebGPU adapterInfo (Anbieter, Architektur, Gerät, Treiber) |
~25+ Bits | Ja |
| WebGPU-Limits (50+ numerische Fähigkeiten) | ~30+ Bits | Ja |
| WebGL-Erweiterungsliste | ~8-12 Bits | Ja |
2.3 Angreifervorteile
- Keine Netzwerkabhängigkeit: Rendering ist lokal, keine Anfrage nötig
- Hardware-gebunden: Kann nicht ohne andere Hardware geändert werden
- Browserübergreifend: Gleiche GPU erzeugt ähnliche Fingerprints über Chrome/Firefox/Safari hinweg
- Passiv: Benutzer kann nicht erkennen, dass er gefingerprintet wird
2.4 Schwächen (aus Angreiferperspektive)
- Blockieren ist für den Benutzer einfach: Firefox-Flags
privacy.resistFingerprintingundCanvasBlockerfunktionieren - Tor Browser besiegt es: Software-Rendering (SwiftShader) normalisiert alle Ausgaben
- Treiberupdates ändern den Fingerprint: Periodische Instabilität
- Rausch-Injektion funktioniert: CanvasBlocker's zufällige Pixel-Injektion bricht Wiederholbarkeit
- Statistische Erkennung von Manipulation ist unvollkommen: Angreifer können nur raten, ob Rauschen injiziert wird
2.5 Vorgeschlagene Abschwächungen
| Abschwächung | Effektivität | Auswirkung | Implementierung |
|---|---|---|---|
| WebGL/WebGPU vollständig blockieren | Hoch | Bricht 3D-Inhalte | JS-Injection |
| Canvas-Rausch-Injektion | Mittel-Hoch | Erkennbar | JS-Injection (CanvasBlocker-Algorithmus) |
| Konsistentes, zufälliges Rauschen pro Sitzung | Mittel | Sitzungskorrelation möglich | JS-Injection |
WEBGL_debug_renderer_info blockieren |
Mittel | Blockiert GPU-Modell-Leck | JS-Injection |
| Software-GPU-Rendering (SwiftShader) | Sehr hoch | Massive Leistungseinbuße | Nur clientseitig (Tor Browser) |
| Canvas-Abmessungen auf Raster runden | Niedrig | Reduziert Entropie | JS-Injection |
Bestes, was Obscura tun kann: Blockieren + Rausch-Injektion per JS. Kann nicht mit Tor Browsers Software-Rendering mithalten.
3. Audio-Hardware-Fingerprinting
Vollständiges Dokument: audio-hardware.md
3.1 Warum es funktioniert
Audioverarbeitung umfasst:
- Audio-Treiber-Implementierung (ALSA, PulseAudio, PipeWire, CoreAudio, WASAPI)
- Hardware-DAC/ADC-Charakteristiken
- Abtastraten-Konvertierungsalgorithmen
- Dynamikkompressionsverhalten
- Audio-Puffer-Handling
Diese erzeugen konsistente, messbare Unterschiede in der Oszillatorausgabe und im Kompressorverhalten.
3.2 Vektoren
| Vektor | Entropie | Anmerkungen |
|---|---|---|
AudioContext getChannelData auf DynamicsCompressor-Ausgabe |
~8-12 Bits | Häufigste |
| AudioContext-Basislatenz | ~4-6 Bits | Hardwareabhängig |
| Abtastratenunterstützung | ~2-3 Bits | Variiert je nach Hardware |
| Maximale Kanalanzahl | ~1-2 Bits | Stereo vs. Surround |
3.3 Angreifervorteile
- Konsistent über Sitzungen hinweg: Gleiche Hardware – gleicher Audio-Fingerprint
- Schwer zu erkennende Manipulation: Die Website kann mehrere Lesevorgänge vergleichen
- Funktioniert im Hintergrund: Keine Benutzerinteraktion nötig
3.4 Schwächen
- DynamicsCompressor-Verhalten ändert sich über Browserversionen
- Kann vollständig blockiert werden (Firefox resistFingerprinting blockiert AudioContext)
- Glätten der Ausgabe ist erkennbar, kann aber nicht von echter Hardware mit identischem Verhalten unterschieden werden
3.5 Vorgeschlagene Abschwächungen
| Abschwächung | Effektivität | Auswirkung |
|---|---|---|
| AudioContext vollständig blockieren | Hoch | Bricht audioabhängige Apps |
| Kompressorausgabe glätten (alle -100dB zurückgeben) | Mittel | Erkennbares Muster |
| Periodisches Rauschen in Ausgabepuffer injizieren | Mittel-Hoch | Komplex, erkennbar |
| Abtastrate auf festen Wert setzen | Niedrig | Nur ein Signal |
Bestes, was Obscura tun kann: AudioContext per JS-Injection blockieren.
4. CPU- & Plattform-Fingerprinting
Vollständiges Dokument: cpu-platform.md
4.1 Warum es funktioniert
Die CPU ist die grundlegendste Systemkomponente. Ihr Verhalten ist deterministisch und über JavaScript messbar:
- Gleitkomma-Arithmetik-Präzision (IEEE-754-Konformität variiert geringfügig)
performance.now()-Auflösung (abhängig von Hardware-Timer, OS)- Wasm-basierte Feature-Erkennung (SIMD, AES-NI, AVX, BMI1/BMI2, POPCNT)
- Cache-Timing-Seitenkanäle (wenn auch in Browsern abgeschwächt)
- WebAssembly-Ausführungsgeschwindigkeit (relativer Leistungsbenchmark)
4.2 Vektoren
| Vektor | Entropie | Anmerkungen |
|---|---|---|
| Mathe-Fingerprint (FPU-Präzision) | ~4-6 Bits | Subtil, überraschend identifizierend |
| Wasm-Feature-Erkennung | ~8-12 Bits | CPU-Fähigkeiten |
performance.now()-Auflösung |
~2-3 Bits | OS/CPU-abhängig |
navigator.hardwareConcurrency |
~3-4 Bits | Kernanzahl (per JS spoofbar) |
4.3 Angreifervorteile
- Hardware-gebunden: CPU-Features ändern sich nicht
- Wasm ist schnell: Binäre Feature-Erkennung in <1ms
- Kann auf Proxy-Ebene nicht gespooft werden: Wasm läuft lokal
4.4 Schwächen
performance.now()-Präzision in Browsern reduziert (1ms → 100μs → 5μs → siehe-saw)- Wasm-Feature-Erkennung hängt davon ab, ob der Browser sie offenlegt
hardwareConcurrencyist per JS spoofbar – bereits als kontrollierbar gelistet- Mathe-Fingerprint hat sehr niedrige Entropie – nur in Kombination nützlich
4.5 Vorgeschlagene Abschwächungen
| Abschwächung | Effektivität | Auswirkung |
|---|---|---|
performance.now()-Präzision per JS reduzieren |
Niedrig | Angreifer verwenden Wasm-Timing |
| Wasm vollständig blockieren | Hoch | Bricht viele Websites |
hardwareConcurrency überschreiben |
Hoch | Trivial per JS-Injection |
| Mathe-FPU-Fingerprint akzeptieren | Keine | Zu niedrige Entropie allein |
Bestes, was Obscura tun kann: Akzeptieren oder Wasm blockieren (drastisch).
5. Inhärente Browser-Features & Implementierungs-Eigenarten
Vollständiges Dokument: browser-features-quirks.md
5.1 Warum es funktioniert
Jede Browser-Engine (Blink, Gecko, WebKit) hat eine einzigartige Menge von:
- Unterstützten Web-APIs (100+ binäre Features)
- CSS-Eigenschaftsunterstützung
- Implementierungsfehlern und Eigenarten
- Standardeinstellungen (Schriftgröße, Scrollbalkenbreite, Formularstyling)
- Unicode-Darstellungsverhalten
- Emoji-Unterstützungsversion
5.2 Vektoren
| Vektor | Entropie | Anmerkungen |
|---|---|---|
| Feature-Unterstützungsvektor (~100 Features) | ~10-15 Bits | Stark korreliert |
| CSS-Rendering-Eigenarten | ~5-8 Bits | Engine-spezifisch |
| Unicode/Emoji-Darstellung | ~3-5 Bits | OS+Browser abhängig |
| Scrollbalkenbreite | ~2-3 Bits | OS-abhängig |
| Standardschriftmetriken | ~4-6 Bits | OS+Browser abhängig |
5.3 Angreifervorteile
- Kann nicht geändert werden: Diese sind dem Browser/OS inhärent
- Keine Berechtigung nötig: Keine Benutzerzustimmung erforderlich
- Schwer zu blockieren: Blockieren von Features ändert den Feature-Vektor selbst
5.4 Schwächen
- Identifiziert hauptsächlich Browser-Familie + Version, nicht einzelne Benutzer
- Niedrige Entropie innerhalb derselben Browserversion (alle Chrome-120-Benutzer sehen ähnlich aus)
- Feature-Erkennungsskripte können DNS-blockiert werden, bevor sie laden
5.5 Vorgeschlagene Abschwächungen
| Abschwächung | Effektivität | Auswirkung |
|---|---|---|
| DNS-Blockierung von Fingerprinting-Skript-Domains | Hoch | Stoppt Feature-Aufzählung vollständig |
| Akzeptieren – niedrige individuelle Entropie | Passiv | Kann dennoch mit anderen Signalen korrelieren |
| Browser patchen (nicht auf Proxy-Ebene) | Sehr hoch | Erfordert eigenen Browser-Build |
Bestes, was Obscura tun kann: DNS-Blockierung bekannter Fingerprinting-Domains.
6. Verhaltensbiometrie
Vollständiges Dokument: behavioral-biometrics.md
6.1 Warum es funktioniert
Benutzerverhaltensmuster sind höchst individuell:
- Mausbewegungsbahnen (Geschwindigkeit, Beschleunigung, Zittern)
- Tastendynamik (Tastenhaltedauer, Inter-Tasten-Intervalle, Fehlermuster)
- Scrollmuster (Geschwindigkeit, Beschleunigung, Pausenverhalten)
- Touch-Gesten (bei Mobilgeräten: Wischwinkel, Druck, Geschwindigkeit)
- Lesemuster (Scrollen-dann-Pause-Rhythmus)
- Klick-/Tipp-Timing und Positionspräferenzen
6.2 Vektoren
| Vektor | Entropie | Anmerkungen |
|---|---|---|
| Tastendynamik | ~15-25 Bits | Hochgradig individuell |
| Mausbewegung | ~10-20 Bits | Weniger stabil über Zeit |
| Scrollverhalten | ~8-12 Bits | Inhaltsabhängig |
| Touch-Gesten | ~12-18 Bits | Mobilgeräte-spezifisch |
6.3 Angreifervorteile
- Kontinuierliche Authentifizierung: Keine Momentaufnahme, sondern fortlaufend
- Schwer zu fälschen: Das Verhalten eines anderen Benutzers nachzuahmen ist extrem schwierig
- Keine JS-API-Einschränkung: Alles aus JS-Event-Listenern lesbar
6.4 Schwächen
- Erfordert signifikante Benutzerinteraktion: Kann nicht passiv fingerprinted werden
- Hohe Varianz: Verhalten ändert sich mit Stimmung, Müdigkeit, Kontext
- Lange Erfassungszeit: Benötigt Minuten der Interaktion
- Maschinelles Lernen erforderlich: Einfaches Hashing funktioniert nicht
- Leicht zu stören: Jedes Skript, das das Timing beeinflusst, bricht es
6.5 Vorgeschlagene Abschwächungen
| Abschwächung | Effektivität | Auswirkung |
|---|---|---|
| Maus-/Touch-Event-Listener per JS-Überschreibung blockieren | Mittel | Bricht interaktive Websites |
| Synthetisches Timing-Rauschen injizieren | Niedrig | Kann herausgefiltert werden |
| Tor Browser für hochsensible Sitzungen verwenden | Sehr hoch | Praktischste Lösung |
| Akzeptieren – Verhalten ist kontextabhängig | Passiv | Funktioniert nur bei eingeloggten Sitzungen |
Bestes, was Obscura tun kann: Sehr begrenzt. Tor Browser ist die praktikable Lösung.
7. Residuale Netzwerk-Fingerprints
Vollständiges Dokument: residual-network.md
7.1 Warum es funktioniert
Selbst mit TLS- und HTTP-Spoofing bleiben residuale Netzwerksignale bestehen:
- TCP/IP-Stack-Parameter (vom Container-OS geerbt)
- Netzwerk-Umlaufzeit (RTT) und ihre Varianz
- MTU-Pfadfindung
- Paket-TTL (verrät ungefähre Hop-Anzahl)
- Clock Skew zwischen Client und Server
- HTTP/3-QUIC-Transportparameter (wenn nicht blockiert)
7.2 Vektoren
| Vektor | Entropie | Anmerkungen |
|---|---|---|
| TCP-Fenstergröße | ~2-4 Bits | Container-OS-spezifisch |
| Initialer TTL | ~1-2 Bits | 64 vs. 128 |
| RTT + Varianz | ~5-8 Bits | Netzwerkpfadabhängig |
| Clock Skew | ~4-8 Bits | Hardware-Clock-Drift |
| HTTP/2-SETTINGS (falls nicht gespooft) | ~6-10 Bits | Proxy-Bibliothek-spezifisch |
7.3 Angreifervorteile
- Immer vorhanden: Netzwerksignale sind unvermeidbar
- Können kombiniert werden: Kreuzreferenzierung mehrerer schwacher Signale erhöht Entropie
- Stabil: Netzwerkpfad ändert sich selten
7.4 Schwächen
- Niedrige individuelle Entropie: TCP/IP allein identifiziert selten
- Geteilte Container-Umgebung: Mehrere Benutzer hinter demselben Container sehen ähnlich aus
- TLS-Spoofing eliminiert das identifizierendste Signal
7.5 Vorgeschlagene Abschwächungen
| Abschwächung | Effektivität | Auswirkung |
|---|---|---|
| TLS-Fingerprint-Spoofing (JA3/JA4 via utls) | Sehr hoch | Kritisch für Obscura |
| HTTP/2-SETTINGS-Spiegelung | Hoch | Komplexe Implementierung |
| TCP-Parameter normalisieren | Keine | Container erbt Host |
| Über VPN/Tor-Upstream routen | Hoch | Ändert Netzwerkcharakteristiken |
Bestes, was Obscura tun kann: TLS + HTTP/2-Spoofing. TCP/IP wird akzeptiert.
8. Erkennung von Proxy- & Spoofing-Inkonsistenzen
Vollständiges Dokument: proxy-detection.md
8.1 Warum es funktioniert
Der Akt des Spoofings erzeugt erkennbare Muster:
- Profil-Inkonsistenz: Chrome-User-Agent + Go-TLS-Stack + Win32-Plattform + Nicht-Windows-Schriften
- Fehlende Signale: Blockierte APIs (WebGL gibt null zurück) erzeugen einen einzigartigen "blockiert"-Fingerprint
- Timing-Anomalien: MITM fügt messbare Latenz hinzu
- Zertifikats-Fingerprints: Selbstsignierte CA-Zertifikate sind erkennbar
- Header-Normalisierung: Zu saubere/konsistente Header (echte Browser haben Variation)
- JavaScript-Override-Erkennung:
Object.getOwnPropertyDescriptor()kannObject.defineProperty-Überschreibungen erkennen
8.2 Erkennungstechniken
| Technik | Was sie erkennt | Zuverlässigkeit |
|---|---|---|
| TLS-Fingerprint-Diskrepanz | Proxy-Software vs. behaupteter Browser | Sehr hoch |
| Feature-Blockierung | Nutzung von Datenschutztools | Hoch |
| JS-Override-Erkennung | Injizierte Skripte | Mittel |
| Zertifikatsprüfung | MITM-Proxy | Hoch |
| Timing-Analyse | Proxy-Latenz | Mittel |
| Signalübergreifende Korrelation | Profil-Inkonsistenz | Sehr hoch |
8.3 Angreifervorteile
- Spoofing vergrößert die erkennbare Oberfläche: Je mehr du änderst, desto mehr gibt es zu erkennen
- Statistische Analyse: Vergleich mit großen Datensätzen zeigt Anomalien
- Maschinelles Lernen: Kann Muster finden, die Menschen übersehen
8.4 Schwächen
- Erkennung ist probabilistisch, nicht deterministisch
- Falschpositive: Legitime Browser-Updates sehen aus wie Spoofing
- Datenschutztools werden von Millionen genutzt: Als "Datenschutzbenutzer" erkannt zu werden, ist nicht einzigartig
- Katz-und-Maus: Überschreibungserkennung kann durch tiefere Überschreibungen konterkariert werden
8.5 Vorgeschlagene Abschwächungen
| Abschwächung | Effektivität | Auswirkung |
|---|---|---|
| Perfekte Profilkonsistenz | Sehr hoch | Erfordert kontinuierliche Profil-Updates |
| Einige echte Signale preisgeben | Kontraintuitiv | Macht Profil natürlicher |
| Echtes CA-Zertifikat verwenden | Mittel | Vermeidet Selbstsignierungs-Erkennung |
| Timing runden statt entfernen | Mittel | Weniger verdächtig als Null-Latenz |
| Nicht blockieren, sondern spoofen | Hoch | Schwerer zu erkennen als Blockieren |
Bestes, was Obscura tun kann: Strenge Profilkonsistenzprüfung und kontinuierliche Updates.
9. Das Aggregationsproblem
9.1 Individuelle vs. kombinierte Entropie
Eine entscheidende Erkenntnis: Einzelne unkontrollierbare Vektoren haben niedrige Entropie allein, aber kombiniert werden sie identifizierend.
Wobei die individuelle Entropie und die Abhängigkeiten zwischen Vektoren berücksichtigt.
Für unkontrollierbare Vektoren allein (GPU + Audio + CPU + Features + Netzwerk + Verhalten):
Dies reicht aus, um einen Benutzer unter ~ eindeutig zu identifizieren.
9.2 Auswirkungen
- Selbst perfektes Proxy-Spoofing kontrollierbarer Vektoren ist unzureichend, wenn die unkontrollierbaren bestehen bleiben
- DNS-Blockierung ist kritisch: Sie verhindert, dass die Fingerprinting-Bibliothek die unkontrollierbaren Vektoren sieht
- Verteidigung in der Tiefe: Jeder blockierte Vektor reduziert die aggregierte Entropie
10. Vorgeschlagene Forschungsrichtungen
10.1 Kurzfristig (Obscura v1)
- Perfekte Profilkonsistenz: Automatisierte Validierungstools
- DNS-Blocklisten-Pflege: Fingerprinting-Domain-Feed
- Canvas-Rausch-Injektion: Algorithmus von CanvasBlocker
- WebGL/WebGPU-Debug-Info-Blockierung: JS-Injection
- AudioContext-Blockierung: JS-Injection
10.2 Mittelfristig
- Maschinelles Lernen zur Anomalieerkennung: Erkennen, wenn Obscuras Modifikationen erkennbare Muster erzeugen
- Adaptive Profilauswahl: Das Profil wählen, das am besten zur echten Hardware des Benutzers passt (nicht Safari auf Windows behaupten)
- Graceful Degradation: Auf weniger aggressives Spoofing zurückfallen, wenn das Erkennungsrisiko hoch ist
10.3 Langfristig / Außerhalb des Bereichs
- Browser-Modifikation: Eigener Browser-Build, der Fingerprints normalisiert (Tor-Browser-Ansatz)
- Hardware-Level-GPU-Normalisierung: Treiberebenen-Rendering-Interception
- Verhaltensverschleierung: KI-generierte Maus-/Tastaturmuster
- Quantenresistentes Fingerprinting: Zukunftssicher gegen neue Techniken
11. Fazit
Die hier dokumentierten unkontrollierbaren Vektoren stellen die grundlegende Grenze des Anti-Fingerprintings auf Netzwerkebene dar. Kein Proxy kann sie vollständig eliminieren, da sie herrühren von:
- Physik: GPU-Rendering, Audioverarbeitung, Clock-Drift
- Biologie: Benutzerverhaltensmuster
- Technik: Browser-Implementierungsentscheidungen
Obscuras Ansatz ist pragmatisch:
- Kontrollieren, was kontrolliert werden kann (Header, TLS, DNS, JS-APIs) – ~55 % der Oberfläche
- Blockieren, was nicht gespooft werden kann (Canvas, Audio, WebGL) – verhindert Beobachtung
- Das Restrisiko akzeptieren – dokumentieren und überwachen
Die Alternative – perfekter Schutz – erfordert Tor Browser, der dies erreicht, indem er jedes Signal normalisiert, auf Kosten von Funktionalität, Leistung und Bequemlichkeit. Beide Ansätze haben ihre Berechtigung.
Referenzen
- Acar, G. et al. (2014). "The Web Never Forgets: Persistent Tracking Mechanisms in the Wild." CCS 2014.
- Mowery, K. & Shacham, H. (2012). "Pixel Perfect: Fingerprinting Canvas in HTML5." WOOT 2012.
- Eckersley, P. (2010). "How Unique Is Your Web Browser?" PETS 2010.
- Englehardt, S. & Narayanan, A. (2016). "Online Tracking: A 1-million-site Measurement and Analysis." CCS 2016.
- Tor Browser Design Document (2024). "The Design and Implementation of the Tor Browser."
- FingerprintJS (2026). "Browser Fingerprinting Techniques." fingerprintjs.com.
- FoxIO (2024). "JA4: TLS Client Fingerprinting." GitHub.
- Laperdrix, P. et al. (2020). "Browser Fingerprinting: A Survey." ACM TOIT.