WebGL-Pixel-Hash-Fingerprinting rendert eine versteckte 3D-Szene mit GLSL-Shadern und liest die Pixelwerte per gl.readPixels() aus. Da GPUs Fließkommazahlen unterschiedlich runden und interpolieren, entstehen zwischen verschiedenen Geräten minimal abweichende Pixel. Der Hash dieser Pixel ist browserübergreifend stabil und überlebt jede Cookie-Löschung. Mit ~5,7 Bit Entropie ist es ein starkes Fingerprinting-Signal — und nach der DSGVO Teil der Online-Kennzeichnung.
Wie WebGL-Pixel-Hash-Fingerprinting funktioniert
- GLSL-Shader schreiben: Ein Fragment-Shader berechnet Farben mit trigonometrischen Funktionen —
sin(),cos(),fract(). Diese Operationen sind GPU-implementierungsabhängig. - Szene rendern: Ein einfaches Quad (zwei Dreiecke) wird auf einer 32×32-Pixel-Textur gerendert.
- Pixel auslesen:
gl.readPixels()überträgt den Framebuffer-Inhalt in einen JavaScript-Uint8Array. - Hash berechnen: Die Pixelwerte werden zu einem kompakten Hash zusammengefasst (FNV-1a oder MurmurHash).
Codebeispiel
const canvas = document.createElement('canvas');
canvas.width = canvas.height = 32;
const gl = canvas.getContext('webgl');
// Fragment-Shader: GPU-spezifische Fließkomma-Berechnungen
const fragSrc = `
precision highp float;
void main() {
float x = gl_FragCoord.x / 32.0;
float y = gl_FragCoord.y / 32.0;
gl_FragColor = vec4(
fract(sin(x * 127.1) * 43758.5),
fract(sin(y * 311.7) * 43758.5),
fract(sin((x + y) * 74.7) * 43758.5),
1.0
);
}
`;
// ... Shader kompilieren, rendern ...
const pixels = new Uint8Array(32 * 32 * 4);
gl.readPixels(0, 0, 32, 32, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
// FNV-1a Hash
let hash = 2166136261;
for (const byte of pixels) {
hash ^= byte;
hash = (hash * 16777619) >>> 0;
}
console.log(hash.toString(16)); // z. B. "a3f2c891"Warum unterscheiden sich die Pixel zwischen GPUs?
GLSL-Shader sind für Determinismus nicht spezifiziert. Die IEEE 754 Fließkomma-Arithmetik erlaubt implementierungsabhängige Reihenfolgen bei Operationen. Verschiedene GPUs — und sogar verschiedene Treiber-Versionen derselben GPU — können deshalb unterschiedliche Pixelwerte erzeugen:
- NVIDIA: Nutzt eigene CUDA-basierte Fließkomma-Pipeline.
- AMD: GCN/RDNA-Architektur mit abweichender Interpolation.
- Intel: Integrated Graphics mit software-emulierter Präzision.
- Apple Silicon: Metal-Backend mit proprietärer Shader-Kompilierung.
Entropie und Fingerprinting-Wert
| Merkmal | Wert |
|---|---|
| Entropie | ~5,7 Bit |
| Browserübergreifend stabil | Ja (gleiche GPU) |
| Überlebt Cookie-Löschung | Ja |
| Ändert sich nach GPU-Treiber-Update | Manchmal |
UNIGL: Akademische Verteidigung
Die USENIX Security 2019 Forschungsarbeit „UNIGL: Re-Thinking WebGL Fingerprint for Effective Yet Privacy-Preserving Web Authentication" untersuchte, wie WebGL-Pixel-Hashing als Authentifizierungsmerkmal genutzt werden könnte, ohne vollständig auf Cookies angewiesen zu sein. Die Arbeit entwickelte auch Gegenmaßnahmen auf Shader-Ebene, die die GPU-Ausgabe normalisieren.
DSGVO und WebGL-Pixel-Hash
WebGL-Pixel-Hash-Fingerprinting ist für Nutzerinnen und Nutzer vollständig unsichtbar. Es erfordert keine Zustimmung zu Kamera- oder Grafik-Zugriffen und hinterlässt keine Spur im Browserspeicher. Dennoch erzeugt es nach DSGVO- Erwägungsgrund 30 eine Online-Kennung. Websites, die diese Technik zu Tracking-Zwecken einsetzen, benötigen eine Rechtsgrundlage nach Art. 6 DSGVO. Das BSI stuft WebGL-basiertes Fingerprinting in seiner technischen Richtlinie als datenschutzrelevant ein.
Schutzmaßnahmen
- Firefox
privacy.resistFingerprinting: Fügt WebGL- Rendering zufälliges Rauschen hinzu, sodassgl.readPixels()keine konsistenten Hardware-spezifischen Werte zurückgibt. - Brave Browser: Wendet Farbling auf WebGL-Pixel an — pro Sitzung und Ursprung variierend.
- WebGL deaktivieren: Verhindert Pixel-Hash-Fingerprinting vollständig, bricht aber viele Web-Apps.
- Tor Browser: Deaktiviert WebGL-Debugging und normalisiert Rendering-Ausgaben.
Verwandte Signale
WebGL-Pixel-Hash ergänzt den WebGL-Vendor-String und das allgemeine WebGL-Fingerprinting. Testen Sie Ihren WebGL-Hash mit unserem Fingerprint-Tool.


