Busca certificada · auditoria
Como “certifica e assina” funciona de verdade — a diferença entre “confie em nós” e “verifique você mesmo”.
“Certificar” é uma propriedade da computação: a busca devolve todos os nomes dentro do raio, zero falso negativo, porque a poda só descarta um ponto quando uma cota inferior prova que ele está além do raio. É um teorema, verificado em teste contra o brute-force a cada camada.
“Assinar” é outra coisa: é tornar a resposta não-repudiável e verificável por um terceiro. Um regulador não quer a sua palavra de que a triagem estava correta — quer um registro que ele possa checar sozinho, anos depois, e ter certeza de que não foi alterado. É a diferença entre confiança e prova, agora no nível operacional.
Cada triagem emite um documento com três blocos, selado por uma assinatura:
O commit de Merkle é o segredo do “contra a lista certa”: um hash-raiz de toda a lista de sanções. Cada match traz um caminho curto (≈16 hashes) que prova que aquele nome está na lista daquele root — sem precisar transmitir a lista inteira.
O verificador não usa o índice de busca. Precisa apenas da chave pública do serviço e do commit da lista (ambos publicados fora de banda), mais a especificação pública (como normalizar um nome e calcular a distância):
// OFAC SDN real, 45.197 nomes · consulta = variante de um nome sancionado consulta: "shwx kokko special economic zone" · r_α=2 · piso ≥0,95 match: "Shwe Kokko Special Economic Zone" (d=1) · assinado (Ed25519) VERIFICAÇÃO INDEPENDENTE ✓ assinatura Ed25519 válida — íntegro e não-repudiável ✓ commit da lista bate com o root confiável ✓ cada match a ≤ r_α (distância recomputada) — são ✓ cada match é membro da lista comprometida (prova de Merkle) ✓ completude: re-execução exaustiva devolve o mesmo conjunto — nada omitido
A força do registro é que a verificação não depende da palavra do operador:
// (a) alterar o registro depois de assinado alterar a consulta após assinar → assinatura INVÁLIDA ✗ (detectado) // (b) forjar um match perfeito e RE-ASSINAR com a mesma chave forjar distância=0 e re-assinar → o verificador recomputa e acha d=1 ≠ 0 ✗ (detectado)
No caso (a), a assinatura sela o conteúdo exato — um byte trocado a invalida. No caso (b), mesmo que o atacante re-assine, o verificador recomputa a distância a partir do nome e da consulta: a prova não vem da palavra de quem assinou, vem da matemática pública.
A assinatura garante a claim assinada, com o seu escopo e as suas premissas: a métrica, o raio, o piso de recall conforme (com a premissa de trocabilidade) e a versão exata da lista. Ela não garante a verdade do mundo — se a premissa de trocabilidade quebra (um nome adversarial fora da distribuição de calibração), a garantia não cobre aquilo. Mas a premissa está dentro do registro, explícita e auditável.
Essa é a diferença entre confiança e prova: a confiança esconde a premissa; a assinatura a nomeia, prende ao registro, e deixa um terceiro conferir tudo o que está a jusante dela.
Peças: assinatura Ed25519 e commit de Merkle com SHA-256 (ambos da biblioteca padrão). O verificador é ~100 linhas e não depende do motor de busca. Código de referência aberto (motor SIEVE).