Em agosto de 2021, a Apple anunciou que iria escanear cada foto do seu iPhone antes de enviá-la para o iCloud. Em setembro do mesmo ano, após duas semanas de polêmica, retirou a proposta. Em dezembro de 2022, declarou oficialmente que o projeto estava morto. Em 2022, a Comissão Europeia propôs um regulamento que obriga WhatsApp, Signal e Telegram a fazer exatamente o que a Apple se recusou a implementar. Esse regulamento — conhecido como Chat Control — ainda está em pauta no Conselho Europeu.
As duas iniciativas dependem do mesmo algoritmo: um hash perceptual de 64 bits, implementado em apenas 40 linhas de Python. Não é exagero. Nem metáfora. São 40 linhas, e ao terminar este artigo, você terá uma versão executável no seu computador.
A maioria dos debates públicos — tanto no Brasil quanto fora — ocorre sem que os participantes realmente entendam como o mecanismo funciona. A regulação é discutida em termos políticos (“privacidade contra segurança infantil”) enquanto o núcleo técnico permanece uma caixa-preta. Este post é um antídoto. Quando terminar a leitura, você poderá tomar uma posição com base técnica. Se não quiser, ao menos você saberá exatamente o que está sendo proposto.
O problema: SHA-256 não reconhece que duas fotos são iguais
O primeiro instinto de qualquer desenvolvedor para resolver esse problema é usar o SHA-256. Se duas imagens produzem o mesmo hash, então são a mesma imagem. Simples, rápido, criptograficamente sólido.
Mas não funciona.
import hashlib
def sha256(path):
with open(path, "rb") as f:
return hashlib.sha256(f.read()).hexdigest()
# Mesma foto, duas compressões diferentes
sha256("foto.jpg") # "a7f3..."
sha256("foto_reencoded.jpg") # "9c2e..." (completamente diferente)
Altere um único bit — como reencoder uma imagem JPEG de qualidade 95% para 90%, mudar o formato de WebP para JPEG ou ajustar minimamente o brilho — e o SHA-256 produzirá um hash completamente diferente. Os dados são claros: a similaridade criptográfica é intolerante por design. Isso é uma característica, não um problema.
Para detectar “a mesma foto, mesmo que difira na compressão”, é necessário um algoritmo mais tolerante. É aí que entra o hash perceptual: uma assinatura de 64 bits capaz de resistir a mudanças que não alterem o conteúdo da imagem em si.
aHash: média de brilho
O primeiro método útil chama-se Average Hash, ou aHash. A ideia é brutalmente simples:
import numpy as np
from PIL import Image
def average_hash(path, size=8):
img = Image.open(path).convert("L").resize((size, size))
arr = np.asarray(img, dtype=np.float32)
mean = arr.mean()
bits = (arr.flatten() > mean).astype(int)
return "".join(str(b) for b in bits)
def hamming(a, b):
return sum(x != y for x, y in zip(a, b))
Você reduz a imagem para um tamanho de 8×8 pixels, transforma em escala de cinza, calcula a média de brilho e cada pixel se torna 1 se estiver acima da média ou 0 caso contrário. Resultado: 64 bits que representam a distribuição global do brilho.
Duas imagens “iguais” produzem hashes com uma distância de Hamming baixa (≤ 5 bits de diferença). Imagens diferentes produzem hashes com distância maior (40+ bits). Funciona com imagens redimensionadas, recortadas ou reencodificadas levemente. Contudo, quebra caso alguém ajuste o contraste ou o brilho global da imagem. É o primeiro passo.
dHash: gradientes relativos
O próximo passo foi publicado por Neal Krawetz em 2011 e chama-se Difference Hash, ou dHash:
def difference_hash(path, size=8):
img = Image.open(path).convert("L").resize((size + 1, size))
arr = np.asarray(img, dtype=np.float32)
diff = arr[:, 1:] > arr[:, :-1]
return "".join("1" if v else "0" for v in diff.flatten())
Em vez de medir brilhos absolutos, mede-se gradientes horizontais relativos: cada pixel é 1 se for mais claro que o pixel à sua direita. Se toda a imagem escurece em 30%, os gradientes relativos permanecem os mesmos. O dHash resiste a mudanças de contraste, gama ou gradação de cores — cenários onde o aHash falhava.
Quarenta linhas de Python, duas semanas de biblioteca (incluindo PIL), e você já tem a ferramenta que está no centro da regulação europeia mais debatida do ano.
De 40 linhas para infraestrutura global
O que você fez com average_hash e difference_hash é, com refinamentos, o que processa boa parte das imagens que circulam pela internet.
Microsoft PhotoDNA (2009). Desenvolvido por Hany Farid (Dartmouth) em colaboração com o Microsoft Research para detectar material de abuso sexual infantil (CSAM). É uma variante sofisticada do mesmo princípio: reduzir a imagem a uma assinatura curta e robusta contra reencodificação, permitindo o pareamento por distância. Sua implementação exata é proprietária, mas os fundamentos são da mesma família algorítmica. A Microsoft afirma que o PhotoDNA processa bilhões de imagens por mês nas maiores plataformas.
Meta PDQ (2019). Variante open-source desenvolvida internamente na Meta (antigo Facebook) e publicada como parte do ThreatExchange no GitHub. Ao contrário do PhotoDNA, este possui código aberto: é possível lê-lo, executá-lo e entendê-lo. Segundo a Meta, a segurança não deve depender do segredo do algoritmo, mas da dificuldade de atacar o sistema como um todo.
YouTube Content ID (2007). Utiliza hashes perceptuais adaptados para vídeos: divide cada upload em impressões digitais por quadro e compara com um banco de dados de conteúdos de direitos autorais registrados. Detecta reuploads, mashups que reutilizam cenas inteiras e clipes de filmes inseridos. Não usa SHA: tolera reencodificação, cortes em logos e pequenas rotações.
Google Photos, Apple Photos, Amazon Photos. Quando seu celular avisa “essa foto já está no iCloud do iPad”, ele não compara bytes. Ele utiliza variantes do hash perceptual em embeddings de redes neurais convolucionais para identificar “a mesma foto” mesmo com compressões ou formatos diferentes, ou leves recortes.
Apple NeuralHash (2021). A proposta que foi retirada. NeuralHash não era um pHash clássico; era uma rede neural convolucional treinada para produzir o mesmo embedding frente a transformações invariantes (rotação, recortes, compressão). O resultado era condensado em 96 bits por meio de Locality-Sensitive Hashing. Tecnologicamente mais sofisticado que PhotoDNA, mas conceitualmente baseado no mesmo princípio: uma assinatura curta, robusta e que permite comparações por distância.
O padrão é consistente: o mesmo algoritmo, sob nomes distintos e com refinamentos variados, tornou-se infraestrutura invisível da web. A maioria dos usuários nem sabe que ele existe. A maioria dos desenvolvedores já ouviu falar, mas nunca o implementou. Agora o Parlamento Europeu está prestes a legislar sobre seu uso obrigatório em comunicações criptografadas.
Os pontos críticos
Se o algoritmo fosse infalível, o debate seria trivial. Mas ele não é. Há quatro problemas estruturais que você deve conhecer antes de formar uma opinião.
Falsos positivos
Duas imagens completamente diferentes podem gerar hashes idênticos. Em um hash de 64 bits há 2^64 = 18 trilhões de hashes possíveis, mas o espaço de imagens “razoáveis” (as que seriam produzidas por humanos, não ruído aleatório) é muito menor e apresenta padrões estatísticos. Colisões acidentais são raras, mas não impossíveis.
Em 2021, durante a polêmica com a Apple, usuários documentaram colisões acidentais do NeuralHash com imagens do cotidiano: como um cachorro e uma escultura abstrata. Apple alegava uma taxa de “1 falso positivo por bilhão de contas por ano”. Pesquisadores contestaram esse número ao demonstrarem que, com modificações simples, a taxa subia drasticamente.
Falsos negativos
Gire uma imagem 10 graus, recorte 20% da borda direita ou aplique um flip horizontal, e a maioria dos hashes perceptuais não conseguirá reconhecê-la. Os mais sofisticados (como pHash com DCT ou NeuralHash com invariâncias treinadas) resistem um pouco mais, mas todos têm seus limites.
Isso significa que qualquer pessoa determinada pode contornar o sistema usando ferramentas disponíveis em qualquer smartphone: girar a imagem, comprimir em baixa qualidade ou adicionar uma borda de 10 pixels. A base de hashes não reconhecerá a imagem alterada, e o conteúdo ilegal passará sem ser detectado.
Colisões adversariais
Este é o problema mais grave e menos discutido na imprensa geral. Em 18 de agosto de 2021 — menos de duas semanas após o anúncio da Apple — um pesquisador sob o pseudônimo Asuhariet Ygvar publicou no GitHub a engenharia reversa completa do NeuralHash retirada dos binários do iOS. Poucos dias depois, colaborações dirigidas começaram a ser divulgadas: imagens totalmente diferentes com exatamente o mesmo hash, geradas de forma intencional.
Em 2021, Jonathan Prokos, Matthew Green e pesquisadores da Johns Hopkins formalizaram o ataque no artigo “Squint Hard Enough: Attacking Perceptual Hashing with Adversarial Machine Learning” (USENIX Security). Eles demonstraram que é possível gerar:
- Colisões arbitrárias: duas imagens quaisquer com o mesmo hash.
- Pré-imagens direcionadas: dada uma imagem alvo, criar outra visualmente diferente que produza o mesmo hash.
As implicações práticas são graves. Um atacante pode enviar uma imagem inocente cujo hash coincida com um de material CSAM conhecido. Seu celular sinaliza o alerta. Um humano verifica, vê o conteúdo real (inocente), e o sistema é reiniciado. Contudo, o atacante pode automatizar isso contra milhares de alvos: qualquer sistema que dependa de agregar alertas em um limiar (como o design da Apple) fica vulnerável a ataques maliciosos em larga escala. Esse não é um erro de engenharia da Apple. É uma característica estrutural da família de algoritmos perceptuais.
Quem controla a base de hashes
O quarto problema é político. A base de dados de hashes com a qual as imagens são comparadas está sob controle do NCMEC (National Center for Missing & Exploited Children), uma organização privada dos EUA. Os hashes são compartilhados com provedores na Europa e outros países, mas a autoridade sobre o que é incluído ou excluído reside nos EUA.
Isso cria um single point of truth global com consequências pouco discutidas. O que acontece se o NCMEC decidir incluir hashes que não correspondam estritamente ao CSAM? O que acontece se um governo — seja dos EUA ou outra nação que pressione as plataformas relacionadas — exigir a inclusão de hashes de imagens associadas a dissidência política, conteúdo LGBTQ ou vazamentos jornalísticos? O algoritmo não distingue. Ele detecta o que for alimentado na base.
O debate: Apple em 2021 vs. UE em 2026
Este é o contexto político que destaca a urgência do assunto técnico.
5 de agosto de 2021. A Apple anuncia três funções de “proteção infantil” no iOS 15. Uma delas: escaneamento on-device de cada foto antes de enviá-la ao iCloud Photos, utilizando NeuralHash contra a base de dados do NCMEC. Um limiar de 30 matches dispara o alerta, seguido de revisão humana e reporte às autoridades.
Nas semanas seguintes, a reação foi devastadora. Matthew Green (Johns Hopkins) e Ross Anderson (Cambridge) lideraram a crítica acadêmica com o artigo “Bugs in Our Pockets: The Risks of Client-Side Scanning” (2021), assinado por 14 pesquisadores em criptografia e segurança. O argumento principal: a infraestrutura de escaneamento on-device é a porta de entrada, não a base de hashes comparada. Uma vez construída, governos poderão exigir que seja usada para outros fins. A Apple estaria em uma posição frágil para negar.
Colisões do NeuralHash foram documentadas em questão de dias. Uma carta aberta com mais de 90 organizações assinando (EFF, ACLU, Access Now, Freedom of the Press Foundation) clamava pela retirada. A Apple tentou defender o sistema em uma press call em 13 de agosto, mas os problemas técnicos demonstrados publicamente foram fatais para a narrativa.
Em 3 de setembro de 2021, a Apple anunciou “adiamento”. Em dezembro de 2021, removeu silenciosamente as referências ao CSAM Detection do seu site. Em dezembro de 2022, a função foi declarada oficialmente extinta, substituída pelo Advanced Data Protection (criptografia E2E opcional para o iCloud Photos) — literalmente o oposto.
11 de maio de 2022. A Comissária Europeia Ylva Johansson apresenta a proposta de Regulation to prevent and combat child sexual abuse (CSAR), popularmente chamada de “Chat Control”. A proposta obriga provedores de serviços de comunicação (WhatsApp, Signal, Telegram, iMessage) a detectar CSAM nas comunicações de seus usuários mediante ordens judiciais de detecção. As técnicas permitidas incluem escaneamento on-device com hashes perceptuais sobre mensagens criptografadas.
O paralelismo com o sistema que a Apple abandonou é inquestionável. Os críticos — incluindo os mesmos acadêmicos que contestaram a Apple — destacaram isso explicitamente. Entre 2022 e 2025, a proposta passou por revisões no Parlamento Europeu (que suavizou os pontos mais agressivos), negociações no Conselho (dividido, com Alemanha, Países Baixos e Polônia entre os mais críticos) e revisões periódicas sob diferentes presidências.
Em 2026, o dossier continua vivo. As votações são adiadas, as versões ajustadas, mas a direção estratégica não mudou: a UE está empenhada em estabelecer o escaneamento on-device como ferramenta padrão. O debate está prestes a se cristalizar em uma regulação vinculante para 450 milhões de europeus.
O que você pode fazer
Os dados são claros: entender como funciona o algoritmo é essencial para participar do debate com base. Não opinião. Matemática política.
Ações concretas, em ordem crescente de esforço:
- Execute o código deste post. Copie
average_hashedifference_hash, aplique em duas fotos suas e meça as distâncias. Observe como o brilho quebra o aHash enquanto o dHash resiste. São só quarenta linhas, trinta minutos. - Leia o whitepaper do PDQ no repositório
facebook/ThreatExchangeno GitHub. É código real, documentado e em produção. Entender a evolução do pHash para o PDQ em algumas horas dá a você a base técnica necessária para abordar qualquer artigo sobre o tema com pensamento crítico. - Leia “Bugs in Our Pockets” (Anderson et al., 2021, arXiv:2110.07450). Este é o documento de referência contra o escaneamento on-device, assinado pela maior parte da comunidade de criptografia séria. Quarenta páginas, linguagem densa, mas define os argumentos do debate acadêmico.
- Acompanhe as votações sobre o CSA Regulation no Parlamento Europeu e no Conselho. Ferramentas públicas como chatcontrol.eu (de Patrick Breyer, eurodeputado do Partido Pirata) consolidam o estado atual do dossier.
O que você não deve fazer: opinar sem ter visto o algoritmo funcionar. Não por purismo técnico, mas por honestidade. O algoritmo que está no centro deste debate cabe em 40 linhas de um código que qualquer desenvolvedor pode dominar. Se você nunca leu, sua opinião sobre uma regulamentação que depende dele será, no máximo, um eco sobre o tweet de outra pessoa.
A questão não é se a UE vai regular as comunicações criptografadas. É se nós que opinamos sobre como isso será feito o faremos com base ou sem ela.
Referências
- Krawetz, Neal. “Looking Up Images”. HackerFactor Blog, 2011. A introdução clássica ao pHash e dHash.
- Meta. “PDQ — Perceptual Hashing for Image Similarity”. GitHub:
facebook/ThreatExchange, 2019. - Prokos, J.; Fendley, N.; Green, M.; Jois, T. M.; Cao, Y. “Squint Hard Enough: Attacking Perceptual Hashing with Adversarial Machine Learning”. USENIX Security Symposium, 2023 (arXiv:2112.09283).
- Abelson, H.; Anderson, R.; Bellovin, S. M.; et al. “Bugs in Our Pockets: The Risks of Client-Side Scanning”. arXiv:2110.07450, 2021.
- Apple. “CSAM Detection Technical Summary”, agosto 2021. Arquivado; não publicado oficialmente.
- Ygvar, A. “AppleNeuralHash2ONNX”. GitHub, agosto 2021. Engenharia reversa e gerador de colisões.
- Comissão Europeia. “Proposal for a Regulation laying down rules to prevent and combat child sexual abuse”, COM(2022) 209 final, 11 de maio de 2022.
- NCMEC. CyberTipline Reports, estatísticas anuais.
Este artigo foi publicado originalmente em espanhol e traduzido com a ajuda de IA.