Impressão digital de TLS e hashes JA4 explicados
Por que as mensagens Client Hello do TLS são uma mina de ouro para a identificação de dispositivos — e como os hashes JA4 nos dão uma impressão digital estável que sobrevive às atualizações de navegadores.
Toda conexão HTTPS começa com um handshake TLS, e todo handshake TLS começa com uma mensagem Client Hello. Essa mensagem contém uma riqueza de informações sobre o cliente que está se conectando — conjuntos de cifras, extensões, curvas suportadas, algoritmos de assinatura — que varia significativamente entre navegadores, versões e sistemas operacionais. A impressão digital de TLS captura essas informações e as usa como um sinal de identificação.
O que há em um Client Hello?
Quando um navegador se conecta a um servidor HTTPS, ele envia uma mensagem Client Hello contendo: a versão do TLS que suporta, a lista de conjuntos de cifras que está disposto a usar, as extensões TLS que inclui (como SNI, ALPN e key share), as curvas elípticas que suporta, os algoritmos de assinatura que aceita e os métodos de compressão que oferece.
Cada família de navegadores tem uma impressão digital distinta. Chrome, Firefox e Safari enviam ordenações de conjuntos de cifras diferentes, conjuntos de extensões diferentes e preferências de curvas diferentes. Mesmo dentro da mesma família de navegadores, versões diferentes podem enviar mensagens Client Hello ligeiramente diferentes à medida que conjuntos de cifras são adicionados ou descontinuados.
Do JA3 ao JA4
O JA3 foi o hash original de impressão digital de TLS, introduzido pela Salesforce em 2017. Ele concatena a versão do TLS, os conjuntos de cifras, as extensões, as curvas elípticas e os formatos de ponto EC em uma string e calcula um hash MD5. Embora inovador, o JA3 tem limitações: ele produz um único hash opaco difícil de analisar, e mudanças menores em qualquer campo produzem um hash completamente diferente.
O JA4, introduzido pela FoxIO em 2023, aprimora o JA3 de várias formas. Ele produz uma impressão digital estruturada com três componentes: um prefixo legível por humanos (como "t13d1715h2" — TLS 1.3, 17 conjuntos de cifras, 15 extensões, HTTP/2), um hash ordenado dos conjuntos de cifras e um hash ordenado das extensões. Essa estrutura torna as impressões digitais JA4 analisáveis num relance, mantendo a precisão necessária para a identificação.
Por que as impressões digitais de TLS importam para a inteligência de dispositivos
As impressões digitais de TLS são valiosas porque são coletadas antes de qualquer JavaScript executar. Um bot que falsifica seu user agent, forja sua renderização de canvas e altera as propriedades do navigator ainda envia uma mensagem Client Hello genuína a partir da biblioteca TLS que realmente usa. Se o Client Hello diz "biblioteca crypto/tls do Go" mas o user agent diz "Chrome 124", sabemos que algo está sendo falsificado.
Essa validação cruzada é extremamente poderosa para a detecção de bots. A maioria dos frameworks de automação — Selenium, Puppeteer, Playwright — usa a pilha TLS nativa do navegador, então suas impressões digitais de TLS correspondem ao navegador que controlam. Mas clientes HTTP personalizados, scrapers baseados em Go e scripts Python que usam a biblioteca requests têm impressões digitais de TLS distintas que os identificam imediatamente como clientes que não são navegadores.
Estabilidade da impressão digital de TLS
Uma preocupação com a impressão digital de TLS é a estabilidade entre atualizações de navegadores. Quando o Chrome adiciona ou remove um conjunto de cifras, a impressão digital de TLS muda. Na prática, isso acontece com menos frequência do que você imagina. A lista de conjuntos de cifras do Chrome é relativamente estável — mudanças importantes acontecem uma ou duas vezes por ano, não a cada versão.
O formato estruturado do JA4 ajuda aqui. O prefixo legível por humanos permanece estável entre mudanças de versão menores (a contagem de conjuntos de cifras e extensões não muda com frequência), então, mesmo quando o hash detalhado muda, o prefixo fornece continuidade. Em nosso sistema de identificação de múltiplos níveis, os dados de impressão digital de TLS são colocados no Nível 2 — estáveis o suficiente para contribuir com a identificação, mas processados por meio de correspondência entre sessões para lidar com o deslocamento esperado.
Coleta no lado do servidor
Ao contrário dos sinais do lado do cliente que exigem a execução de JavaScript, as impressões digitais de TLS são coletadas inteiramente no servidor. Nossos servidores de borda inspecionam o handshake TLS bruto e extraem o Client Hello antes de a conexão ser estabelecida. Isso significa que a impressão digital de TLS funciona mesmo quando o JavaScript está bloqueado, quando o navegador tem extensões de privacidade instaladas ou quando o cliente não é um navegador de forma alguma.
Essa natureza do lado do servidor também torna as impressões digitais de TLS resistentes à falsificação. Embora seja teoricamente possível criar um Client Hello TLS personalizado que imite um navegador específico, fazer isso exige implementar TLS em baixo nível — muito mais esforço do que mudar uma string de user agent. A maioria das ferramentas de falsificação nem tenta.
Integração com o Device Identification
Em nosso mecanismo de identificação de dispositivos, a impressão digital de TLS serve tanto como sinal quanto como validador. Como sinal, ela contribui para a impressão digital geral do dispositivo com seu próprio peso de identificação. Como validador, ela fornece uma verificação cruzada contra a identidade declarada do navegador. Se os sinais do JavaScript dizem "Chrome no macOS" mas a impressão digital de TLS diz "Firefox no Linux", a discrepância dispara um sinalizador de adulteração em nossa análise de Smart Signals.