Cum funcționează urmărirea amprentei digitale în profunzime
De la handshake-uri TLS la randarea canvas — cum reconstruim amprenta digitală a unui dispozitiv folosind peste 130 de semnale pasive, fără cookie-uri sau stocare.
Fiecare dispozitiv care se conectează la internet lasă în urmă o dâră de artefacte tehnice — o amprentă digitală. La tracio.ai, reconstruim această amprentă din peste 130 de semnale pasive colectate în timpul unei singure încărcări de pagină, fără a ne baza pe cookie-uri, localStorage sau vreo formă de stocare persistentă pe partea de client. Acest articol explică exact cum funcționează acest proces.
Stratul de colectare a semnalelor
Când agentul nostru JavaScript se încarcă în browserul unui vizitator, începe să colecteze semnale din mai multe categorii simultan. Randarea canvas, interogările parametrilor WebGL, procesarea AudioContext, enumerarea fonturilor și citirea proprietăților navigatorului rulează toate în paralel. Întregul proces de colectare se finalizează în mai puțin de 50 de milisecunde pe hardware modern.
Ideea-cheie este că fiecare semnal captează un aspect diferit al stivei hardware și software a dispozitivului. Randarea canvas reflectă GPU-ul, driverul și motorul de randare a fonturilor. Parametrii WebGL expun modelul plăcii grafice și capabilitățile acesteia. AudioContext dezvăluie diferențe în modul în care DSP-ul audio procesează operațiile în virgulă mobilă. Proprietățile navigatorului raportează numărul de nuclee CPU, memoria, platforma și setările de limbă.
Echipa noastră a măsurat acest lucru pe 2 miliarde de evenimente luna trecută: timpul median de colectare a fost de 38ms, iar percentila 99 a fost de 52ms. De fapt, am încercat mai întâi abordarea naivă — colectarea semnalelor secvențial. A fost de 40 de ori mai lentă. Colectarea în paralel cu o barieră de timeout a fost una dintre primele decizii arhitecturale pe care le-am luat corect.
Amprentarea TLS: primul strat
Înainte ca JavaScript-ul nostru să se execute măcar, browserul a dezvăluit deja informații semnificative prin handshake-ul TLS. Mesajul Client Hello conține suitele de cifruri pe care browserul le suportă, extensiile TLS pe care le folosește, curbele eliptice pe care le preferă și algoritmii de semnătură pe care îi acceptă. Aceste informații sunt determinate de biblioteca TLS a browserului și variază semnificativ între familiile de browsere, versiuni și sisteme de operare.
Capturăm această amprentă TLS folosind hashing-ul JA4 — un înlocuitor modern al JA3 care oferă o granularitate mai bună și o stabilitate mai mare între versiuni. Hash-ul JA4 în sine poate distinge Chrome de Firefox de Safari și adesea restrânge identificarea la un anumit interval de versiuni de browser. Combinat cu semnalele noastre de pe partea de client, oferă un strat de validare încrucișată extrem de greu de falsificat.
Amprentarea Canvas și GPU
Amprentarea canvas exploatează faptul că GPU-uri diferite randează aceleași instrucțiuni de desenare cu diferențe subtile la nivel de pixel. Canvas API ne permite să desenăm o scenă atent proiectată — anumite șiruri de text în mai multe fonturi, forme geometrice cu coordonate specifice și gradienți cu opriri de culoare precise — apoi să calculăm un hash al datelor de pixeli rezultate.
Diferențele de randare provin din variații ale algoritmilor de anti-aliasing, randarea la nivel de sub-pixel, amestecarea culorilor și hinting-ul fonturilor între modelele de GPU și versiunile de driver. Chiar și două dispozitive cu același model de GPU pot produce ieșiri canvas diferite dacă rulează versiuni de driver sau sisteme de operare diferite. Acest lucru face ca hash-ul canvas să fie unul dintre cele mai distinctive semnale ale noastre.
Profilarea hardware prin WebGL
WebGL API
expune informații detaliate despre subsistemul grafic, care merg mult dincolo de șirurile de renderer și vendor. Interogăm dimensiunile maxime de textură, formatele de precizie a shaderelor, extensiile suportate, dimensiunile viewport-ului și zeci de alți parametri care variază între modelele de GPU și configurațiile de driver.
Combinația acestor parametri creează un profil hardware detaliat. Un dispozitiv cu un NVIDIA RTX 4070, de exemplu, va raporta dimensiuni maxime de textură diferite, precizie a shaderelor diferită și suport pentru extensii diferit față de un dispozitiv cu un AMD RX 7800 XT. Acest profil hardware este inerent stabil — nu se schimbă odată cu actualizările de browser, ci doar cu schimbări de hardware sau de driver.
Amprentarea prin procesarea audio
Web Audio API oferă o altă sursă de semnal dependentă de hardware. Creăm un nod oscilator, îl conectăm la un compresor de dinamică și măsurăm buffer-ul de ieșire. Diferențele în precizia virgulei mobile, în implementarea DSP și în algoritmii de reeșantionare între hardware-ul audio și sistemele de operare produc variații măsurabile în ieșire.
Amprentele audio au o unicitate moderată, dar o stabilitate excepțională. Fluxul de procesare audio se schimbă rareori, cu excepția cazului în care utilizatorul schimbă hardware-ul audio sau reinstalează sistemul de operare. Acest lucru face ca semnalele audio să fie ancore valoroase în sistemul nostru de identificare pe mai multe niveluri.
Fuziunea semnalelor și rezolvarea identității
Semnalele brute sunt criptate și transmise către serverul nostru, unde motorul de identificare a dispozitivelor le procesează printr-un sistem de hashing pe trei niveluri. Semnalele la nivel de hardware (canvas, WebGL, audio) formează Nivelul 1 — nucleul stabil al identității. Semnalele la nivel de browser (detectarea funcționalităților, proprietăți CSS, capabilități media) formează Nivelul 2, procesate prin potrivire între sesiuni pentru a gestiona derivele așteptate de la actualizările de browser. Semnalele volatile (user agent, fus orar, limbă) formează Nivelul 3, contribuind la scorarea încrederii fără a determina deciziile de identitate.
Algoritmul de fuziune cântărește fiecare semnal în funcție de unicitatea și stabilitatea sa. O potrivire pe un hash canvas rar are o pondere mult mai mare decât o potrivire pe o rezoluție de ecran comună. Această abordare ponderată asigură că identificarea rămâne exactă chiar și atunci când o parte din semnale se schimbă.
Fără stocare, fără cookie-uri
Un principiu de proiectare esențial al sistemului nostru este că identificarea nu depinde de nicio formă de stocare pe partea de client. Nu setăm cookie-uri, nu scriem în localStorage și nu folosim IndexedDB în scopuri de urmărire. ID-ul vizitatorului este derivat în întregime din caracteristicile inerente ale dispozitivului — hardware-ul, stiva software, configurația de rețea. Acest lucru înseamnă că identificarea supraviețuiește ștergerii cookie-urilor, modului incognito și chiar reinstalării browserului.
Confidențialitate prin arhitectură
Deoarece colectăm doar atribute tehnice ale browserului — fără istoric de navigare, fără date din formulare, fără conținut personal — impactul asupra confidențialității este minim. Ghidul W3C privind amprentarea prezintă bune practici pentru utilizarea responsabilă a semnalelor de browser, iar arhitectura noastră se aliniază cu aceste principii. Cu implementarea găzduită în cloud, toată procesarea are loc pe infrastructura ta. Nicio dată a vizitatorilor nu ajunge vreodată pe serverele noastre. Această arhitectură face ca respectarea GDPR, CCPA și a altor reglementări privind confidențialitatea să fie simplă.