Impressão digital de canvas explicada: por que dois navegadores idênticos desenham pixels diferentes

A impressão digital de canvas é a técnica que mais gente já ouviu falar e que menos gente sabe explicar. A ideia é simples: pedir ao navegador que desenhe algo, ler os pixels de volta e calcular o hash deles. O interessante é por que os pixels diferem entre máquinas.
O desenho
Um script de fingerprinting cria um <canvas> fora da tela, obtém um contexto 2D e desenha uma pequena sequência: um retângulo preenchido, algum texto numa fonte nomeada, talvez um gradiente, uma curva, um emoji. Depois chama toDataURL() ou getImageData() para ler o resultado e passa os bytes por um hash. A saída é uma string curta como 71ae464e. Essa string é o "hash de canvas".
Nada no desenho é secreto, e nada é enviado à GPU que a página já não pudesse descrever. A informação está na renderização, e não nas instruções.
Por que os pixels diferem
O texto é a principal fonte de variação. Renderizar um glifo envolve o arquivo de fonte que foi de fato escolhido (as fontes substitutas diferem conforme o sistema operacional), a estratégia de hinting e de anti-aliasing (tons de cinza ou subpixel, e em qual ordem de subpixel), o rasterizador (FreeType, DirectWrite, CoreText ou o próprio do navegador) e se a GPU ou a CPU fez a composição. Cada um desses fatores produz pixels de borda ligeiramente diferentes. Um único pixel cinza-claro na borda de um "e" basta para mudar o hash por completo.
Gradientes e curvas acrescentam mais: drivers gráficos diferentes e caminhos de anti-aliasing diferentes arredondam valores intermediários de formas distintas. O resultado é que duas máquinas com a mesma versão do navegador, mas GPUs, drivers ou sistemas operacionais diferentes, normalmente produzirão hashes diferentes, enquanto a mesma máquina produz sempre o mesmo hash. Estável e diversificado, exatamente o que um rastreador quer.
O que um hash diz a um site
Por si só, nada sobre quem você é. Ele diz ao site que este navegador renderiza este desenho deste jeito, o que é verdade para algum grupo de máquinas. O tamanho desse grupo é o que importa. Um notebook comum com gráficos integrados e fontes padrão compartilha o hash com muitos outros. Uma configuração incomum pode ser quase única. Combinado com um tamanho de tela, uma lista de idiomas e uma string de renderizador, até um hash comum passa a fazer parte de uma combinação rara.
O que os navegadores fazem a respeito
O Firefox, com o resist-fingerprinting ativado, retorna um canvas em branco ou randomizado e pode pedir permissão para acessar o canvas. O Brave adiciona pequenas perturbações aleatórias às leituras de canvas, de modo que o hash muda entre sites e sessões. O Safari limita quais fontes ficam visíveis e restringe algumas leituras. O próprio Chromium não randomiza o canvas; os navegadores baseados nele que pretendem controlar impressões digitais o fazem com patches próprios, e a qualidade desses patches varia.
O ruído não sai de graça. Um hash de canvas que muda a cada visita é, por si só, um sinal, porque navegadores reais não fazem isso. A melhor estratégia para um perfil de navegador isolado é um hash plausível e consistente, que pareça uma única máquina comum, e não uma máquina diferente a cada hora.
O que um diagnóstico mostra
O PowerScan desenha uma pequena imagem própria e mostra o hash. Ele nunca o envia; o valor existe somente na sua aba. Recarregue e o hash deve ser idêntico. Se não for, algo no navegador está injetando ruído, o que vale saber antes de confiar naquele perfil.


