TLS-fingeravtryck och JA4-hashar förklarade
Varför TLS Client Hello-meddelanden är en guldgruva för enhetsidentifiering — och hur JA4-hashar ger oss ett stabilt fingeravtryck som överlever webbläsaruppdateringar.
Varje HTTPS-anslutning inleds med en TLS-handskakning, och varje TLS-handskakning inleds med ett Client Hello-meddelande. Detta meddelande innehåller en mängd information om den anslutande klienten — chiffersviter, tillägg, stödda kurvor, signaturalgoritmer — som varierar betydligt mellan webbläsare, versioner och operativsystem. TLS-fingeravtryck fångar denna information och använder den som en identifieringssignal.
Vad finns i ett Client Hello?
När en webbläsare ansluter till en HTTPS-server skickar den ett Client Hello-meddelande som innehåller: den TLS-version den stöder, listan över chiffersviter den är villig att använda, de TLS-tillägg den inkluderar (som SNI, ALPN och key share), de elliptiska kurvor den stöder, de signaturalgoritmer den accepterar och de komprimeringsmetoder den erbjuder.
Varje webbläsarfamilj har ett distinkt fingeravtryck. Chrome, Firefox och Safari skickar alla olika ordningar på chiffersviter, olika uppsättningar av tillägg och olika kurvpreferenser. Även inom samma webbläsarfamilj kan olika versioner skicka något olika Client Hello-meddelanden allteftersom chiffersviter läggs till eller fasas ut.
Från JA3 till JA4
JA3 var den ursprungliga hashen för TLS-fingeravtryck, introducerad av Salesforce 2017. Den sammanfogar TLS-versionen, chiffersviterna, tilläggen, de elliptiska kurvorna och EC-punktformaten till en sträng och beräknar en MD5-hash. Även om den var banbrytande har JA3 sina begränsningar: den producerar en enda ogenomskinlig hash som är svår att analysera, och små ändringar i något fält ger en helt annan hash.
JA4, introducerad av FoxIO 2023, förbättrar JA3 på flera sätt. Den producerar ett strukturerat fingeravtryck med tre komponenter: ett läsbart prefix (som ”t13d1715h2” — TLS 1.3, 17 chiffersviter, 15 tillägg, HTTP/2), en ordnad hash av chiffersviterna och en ordnad hash av tilläggen. Denna struktur gör JA4-fingeravtryck analyserbara vid en snabb blick samtidigt som den bibehåller den precision som krävs för identifiering.
Varför TLS-fingeravtryck spelar roll för device intelligence
TLS-fingeravtryck är värdefulla eftersom de samlas in innan någon JavaScript körs. En bot som förfalskar sin user-agent, fejkar sin canvas-rendering och lappar sina navigator-egenskaper skickar fortfarande ett äkta Client Hello-meddelande från vilket TLS-bibliotek den faktiskt använder. Om Client Hello säger ”Go:s crypto/tls-bibliotek” men user-agenten säger ”Chrome 124” vet vi att något förfalskas.
Denna korsvalidering är extremt kraftfull för bot-detektering. De flesta automationsramverk — Selenium, Puppeteer, Playwright — använder webbläsarens inbyggda TLS-stack, så deras TLS-fingeravtryck matchar den webbläsare de styr. Men anpassade HTTP-klienter, Go-baserade scrapers och Python-skript som använder requests-biblioteket har alla distinkta TLS-fingeravtryck som omedelbart identifierar dem som icke-webbläsarklienter.
TLS-fingeravtryckets stabilitet
En oro med TLS-fingeravtryck är stabiliteten över webbläsaruppdateringar. När Chrome lägger till eller tar bort en chiffersvit ändras TLS-fingeravtrycket. I praktiken sker detta mer sällan än man kanske tror. Chromes lista över chiffersviter är relativt stabil — större ändringar sker en eller två gånger om året, inte med varje version.
JA4:s strukturerade format hjälper till här. Det läsbara prefixet förblir stabilt över mindre versionsändringar (antalet chiffersviter och tillägg ändras inte ofta), så även när den detaljerade hashen ändras ger prefixet kontinuitet. I vårt identifieringssystem med flera nivåer placeras TLS-fingeravtrycksdata i nivå 2 — tillräckligt stabila för att bidra till identifiering, men bearbetade genom matchning över sessioner för att hantera förväntad drift.
Insamling på serversidan
Till skillnad från signaler på klientsidan som kräver att JavaScript körs samlas TLS-fingeravtryck in helt och hållet på serversidan. Våra edge-servrar inspekterar den råa TLS-handskakningen och extraherar Client Hello innan anslutningen upprättas. Detta innebär att TLS-fingeravtryck fungerar även när JavaScript är blockerat, när webbläsaren har integritetstillägg installerade eller när klienten inte är en webbläsare alls.
Denna serversidesnatur gör också TLS-fingeravtryck motståndskraftiga mot förfalskning. Även om det teoretiskt är möjligt att skapa ett anpassat TLS Client Hello som efterliknar en specifik webbläsare, kräver detta att man implementerar TLS på en låg nivå — långt mer arbete än att ändra en user-agent-sträng. De flesta förfalskningsverktyg försöker inte ens.
Integration med enhetsidentifiering
I vår motor för enhetsidentifiering fungerar TLS-fingeravtrycket både som en signal och en validerare. Som signal bidrar det till det övergripande enhetsfingeravtrycket med sin egen identifieringsvikt. Som validerare ger det en korskontroll mot den uppgivna webbläsaridentiteten. Om JavaScript-signalerna säger ”Chrome på macOS” men TLS-fingeravtrycket säger ”Firefox på Linux” utlöser avvikelsen en manipuleringsflagga i vår Smart Signals-analys.