WebGL piksel hash'i, GLSL gölgelendirici kodu çalıştırarak GPU'nuzun trigonometrik hesaplamaları nasıl yuvarlayıp yürüttüğünü ölçer; her GPU modeli ikili düzeyde farklı çıktı üretir ve bu fark, gizli mod veya VPN ile değiştirilemez. Tarayıcınızın neler sızdırdığını hemen whatsmy.fyi üzerinde görebilirsiniz.
Özet
WebGL piksel hash'i, genel WebGL parmak izinin render çıktısı bileşenidir. WEBGL_debug_renderer_info uzantısından okunan statik GPU meta verisi yerine, piksel hash'i gerçek bir GPU hesaplaması yürütür: sin(), fract() ve cos() gibi GLSL fonksiyonları içeren karmaşık bir gölgelendirici sahne render eder ve sonuçları gl.readPixels() ile okur. Bu yaklaşım ~5,7 bit entropi sağlar; GPU sürücüsü güncellenene veya donanım değişene kadar kararlı kalır.
WebGL Piksel Hash'i Nedir?
WebGL piksel hash'i, GPU'nun GLSL gölgelendirici hesaplamalarını nasıl yürüttüğünü ölçen bir tarayıcı parmak izi tekniğidir. Farklı GPU mikro mimarileri (NVIDIA, AMD, Intel, Apple Silicon), kayan nokta trigonometrik işlemler için farklı yuvarlama davranışı sergiler; bu durum özdeş gölgelendirici kodu için ikili düzeyde farklı piksel çıktıları üretir.
WebGL Piksel Hash'i Nasıl Çalışır?
Aşama 1 — Gölgelendirici Tabanlı Sahne Kurulumu
Betik, gizli bir WebGL canvas oluşturur ve özenle seçilmiş trigonometrik işlemleri içeren bir parçalı gölgelendirici yükler. GLSL kodu şu formülü kullanır:
// GLSL Parçalı Gölgelendirici — platforma özgü kayan nokta farklarını güçlendirir
precision highp float;
void main() {
vec2 pos = gl_FragCoord.xy / vec2(256.0, 256.0);
// sin/cos/fract: GPU donanımına özgü farklı yuvarlama
float r = fract(sin(pos.x * 127.1 + pos.y * 311.7) * 43758.5453);
float g = fract(sin(pos.x * 269.5 + pos.y * 183.3) * 43758.5453);
float b = fract(sin(pos.x * 419.2 + pos.y * 371.9) * 43758.5453);
gl_FragColor = vec4(r, g, b, 1.0);
}Aşama 2 — Piksel Okuma ve Hash
// Render edilmiş pikselleri oku
const pixels = new Uint8Array(256 * 256 * 4); // RGBA
gl.readPixels(0, 0, 256, 256, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
// MurmurHash veya benzeri ile kompakt hash üret
const hash = murmurHash3(pixels);
// Bu hash:
// - GPU modeline göre değişir (NVIDIA vs AMD vs Intel vs Apple)
// - GPU sürücüsü güncellendiğinde değişir
// - Tarayıcı gizlilik koruması yoksa oturumlar arasında kararlıdırNeden Farklı GPU'lar Farklı Çıktı Üretir?
sin(), cos() ve fract() gibi trigonometrik GPU işlemleri, IEEE 754 kayan nokta standardı kapsamında "yaklaşık" biçimde hesaplanabilir. Her GPU üreticisi bu fonksiyonları kendi donanım optimizasyonlarıyla uygular; bu durum son birkaç bit pozisyonunda farklı sonuçlar doğurur. Bu farklar piksel düzeyinde çıktılara yansır ve karşılaştırma yapılabilecek ölçüde kararlıdır.
WebGL Piksel Hash'i Ne Kadar Benzersiz?
| Bulgu | Değer | Kaynak |
|---|---|---|
| WebGL render çıktısından entropi | ~5,7 bit | Fingerprint.com araştırması |
| GPU ailesi sayısı ayırt edilebilen | 40+ | DrawNApart araştırması, 2022 |
| Hash kararlılığı (aynı GPU, farklı tarayıcı) | Yüksek (Blink tabanlı) | Gözlemsel |
| Sürücü güncellemesinde hash değişikliği | Olası | Gözlemsel |
Renderer Dizesinden Farkı
WebGL satıcı parmak izi (renderer dizesi), GPU modelini doğrudan bir metin dizesi olarak bildirir. WebGL piksel hash'i ise aynı GPU'yu hesaplamalı bir kanıt yoluyla ölçer: "Bu GPU modeli olduğunu söylüyor" yerine "Bu GPU modeli bu çıktıyı üretiyor." Her iki sinyal de genellikle birlikte kullanılır.
Akademik Savunma: UNIGL
2019 USENIX Güvenlik Sempozyumu'nda yayımlanan UNIGL araştırması, WebGL piksel hash tabanlı parmak izine karşı bir savunma önerdi. Bu yaklaşım, tüm WebGL çıktılarını bir sanal GPU katmanı üzerinden gönderip normalize ederek piksel hash'ini platformlar arasında standart kılar. Uygulamada bu yaklaşım, Brave'in Farbling gürültü ekleme stratejisinden daha az benimsenim görmüştür.
WebGL Piksel Hash'i Gerçek Hayatta Kim Tarafından Kullanılır?
Yüksek Hassasiyetli Parmak İzi Servisleri
FingerprintJS Pro, piksel hash'ini renderer dizesiyle birleştirerek eksiksiz bir WebGL sinyal paketi oluşturur. Bu bileşim, yalnızca renderer dizesine kıyasla çok daha güçlü bir tanımlayıcı sağlar.
Bot ve Sahtekâr Tespiti
Yazılım tabanlı Mesa render (gerçek GPU olmayan VM'ler) özgün bir piksel hash'i üretir ve gerçek donanım GPU hash'lerinden kolayca ayırt edilir. Bu tutarsızlık, bot tespitinde güçlü bir sinyal oluşturur.
WebGL Piksel Hash'inden Nasıl Korunursunuz?
- Brave Browser (günlük kullanım için önerilir): Brave'in Farbling sistemi, WebGL piksel çıktısına oturum başına, site başına rastgele gürültü ekler; hash'i kararlı bir tanımlayıcı olmaktan çıkarır.
- Tor Browser:
gl.readPixels()işlevini tamamen devre dışı bırakır; piksel hash hesaplaması mümkün olmaz. - Firefox +
privacy.resistFingerprinting: WebGL çıktısını karartır veya standartlaştırır. - VPN neden işe yaramaz: Piksel hash'i, GPU hesaplamalarından türetilir ve JavaScript değişkeni olarak iletilir — ağ meta verisi olarak değil. VPN bu değeri etkileyemez.
Sık Sorulan Sorular
WebGL piksel hash'i, WebGL renderer dizesinden daha mı güçlü?
Her biri farklı bir boyutu ölçer. Renderer dizesi GPU'nun kimliğini doğrudan bildirir; piksel hash'i ise GPU'nun gerçekten nasıl davrandığını ölçer. Bazı gizlilik araçları renderer dizesini engeller; ancak render davranışını değiştiremez. Ticari sistemler her ikisini birlikte kullanır.
Gizli modda farklı bir hash üretilir mi?
Hayır. Gizli mod depolamayı temizler; ancak GPU hesaplamalarını etkilemez. Piksel hash'i, gizli ve normal pencerede Farbling veya benzeri aktif bir koruma olmadıkça özdeş kalır.
İlgili Makaleler
- WebGL Parmak İzi Nedir? — renderer dizesi ve piksel hash'ini kapsayan kapsamlı WebGL rehberi
- WebGL Satıcı Parmak İzi Nedir? — GPU renderer dizesi ve ANGLE katman analizi
- Canvas Parmak İzi Nedir? — 2D render farklarını kullanan ilgili teknik
- Tarayıcı Parmak İzi Nedir? — tüm sinyallerin birleştirildiği kapsamlı rehber


