Invocie

Tech

Cadeias de hash para trilhas de auditoria à prova de adulteração

A ZATCA exige-as, os auditores da UE adoram-nas e são baratas de implementar. Eis como o SHA-256 encadeado transforma um livro de faturas em algo cuja integridade pode provar.

Invocie Team · 8 de janeiro de 2026 · 5 min de leitura


Um trilho de auditoria à prova de adulteração é aquele em que qualquer modificação a dados históricos é detetável. A técnica clássica — emprestada da blockchain mas muito mais simples — é a cadeia de hash: cada registo contém o hash criptográfico do anterior. Mexes em qualquer registo histórico e todos os hashes seguintes mudam.

A receita

Para cada fatura, calcula:

hash_n = SHA256(prev_hash || canonicalize(payload_n))

// onde canonicalize() produz uma sequência de bytes determinística
// (chaves ordenadas, sem whitespace, formato de números estável).

Guarda o hash na própria fatura. Para provar a integridade de uma fatura, basta verificar que o seu hash é igual ao hash recalculado a partir do hash da fatura anterior e do payload canonicalizado. A ZATCA Fase 2 exige exatamente este esquema.

Porque a canonicalização é tudo

Duas serializações JSON byte-diferentes do mesmo objeto lógico produzem hashes diferentes. RFC 8785 (JCS — JSON Canonicalization Scheme) é a abordagem padrão: chaves ordenadas lexicograficamente, sem whitespace insignificante, números na forma única mais curta, strings escapadas segundo o RFC 8259.

Cadeias por tenant, não globais

Mantém uma cadeia separada por tenant em vez de uma global. Duas razões: (1) podes shardar storage e compute por tenant sem coordenar escritas, e (2) uma corrupção na cadeia de um tenant não envenena o audit trail de toda a gente.

Verificar a posteriori

Um auditor (ou tu, defensivamente) pode rejogar a cadeia desde o génesis: hash do payload da primeira fatura sem prev_hash, verifica que bate certo com o hash guardado, e itera. Qualquer desvio localiza o registo adulterado. O subtle.digest do Web Crypto dá-te SHA-256 em qualquer runtime moderno — Node, Deno ou browser.

A Invocie escreve um hash encadeado em cada fatura e em cada entrada de ComplianceLog. As duas cadeias são independentes: faturas para prova ao estilo ZATCA, logs para auditoria operacional.


Leituras relacionadas

Desenhar uma API de faturação eletrónica multirregião: lições do campo

Se está a construir infraestrutura que serve países de clearance e de post-audit, só tem uma hipótese de acertar nas abstrações. Aqui fica o que aprendemos da forma difícil.

Integrar a faturação eletrónica dos EAU com o teu ERP: guia técnico

Um percurso técnico para o Head of IT e o líder de transformação ERP: como o UAE PINT se mapeia sobre SAP, Oracle, Microsoft Dynamics e ERPs à medida, os dados que tens de limpar primeiro, e os padrões de integração que sobrevivem em produção.

UBL 2.1 em português simples: o padrão XML por trás da faturação eletrónica moderna

Quase todos os mandatos importantes de faturação eletrónica geram UBL 2.1 por baixo. Aqui fica um passeio sem jargão pelas partes que realmente precisas perceber.

Emita faturas conformes em todos os mercados

ZATCA, FTA, Peppol e pós-auditoria global — uma API.

Falar com a nossa equipa