Trilha de auditoria
A trilha de auditoria é o registro de tudo o que acontece com um envelope, do momento em que é criado até a conclusão. Ela é a principal evidência de uma assinatura eletrônica avançada: mostra quem fez o quê, quando, de onde e com qual confirmação de identidade.
O que é registrado#
| Evento | Quando acontece |
|---|---|
envelope_criado |
O envelope foi criado (painel, API ou ChatISP) |
envelope_enviado |
O envelope foi enviado para assinatura |
notificacao_enviada |
Um convite foi entregue a um signatário |
link_aberto |
O signatário abriu o link pessoal |
documento_visualizado |
O signatário abriu o documento |
otp_enviado |
Um código de confirmação foi gerado e enviado |
otp_validado |
O signatário digitou o código correto |
otp_falhou |
O signatário digitou um código errado |
assinado |
O signatário assinou |
recusado |
O signatário recusou, com o motivo |
lembrete_enviado |
Um lembrete foi enviado |
expirado |
O prazo venceu sem todas as assinaturas |
cancelado |
Quem enviou cancelou o envelope, com o motivo |
documento_final_gerado |
A via final foi montada e assinada pela plataforma |
concluido |
O envelope foi concluído |
conclusao_retomada |
A conclusão foi retomada manualmente depois de uma falha |
webhook_entregue |
Um aviso de evento foi entregue ao sistema da conta |
ancoragem |
O hash do dia foi selado com carimbo do tempo (veja abaixo) |
Cada evento guarda data e hora em UTC com microssegundos, o IP e o navegador de quem agiu (quando há uma pessoa agindo), a localização quando o signatário consentiu, e dados próprios do tipo de evento (por exemplo, o canal do código ou o hash da via final).
Nota a trilha nunca guarda nome, e-mail, telefone, CPF, selfie nem documento de identidade. Ela se refere ao signatário só por um identificador interno; os dados pessoais ficam separados e cifrados.
Encadeamento por hash#
Os eventos formam uma cadeia: o hash de cada evento é calculado a partir do conteúdo do evento e do hash do evento anterior. Alterar, inserir ou apagar qualquer registro antigo muda todos os hashes seguintes, e a quebra aparece na verificação. Além disso, os registros são somente de inclusão: nenhum caminho do sistema altera ou apaga um evento.
A cadeia é única para a plataforma inteira, atravessando todas as contas. Isso significa que nem mesmo a reescrita de toda a trilha de um envelope passaria despercebida: ela quebraria a sequência dos eventos de todos os outros envelopes registrados depois.
O hash do último evento de cada envelope é impresso no manifesto da via final e mostrado no validador público.
Fórmula#
Para quem precisa verificar a trilha de forma independente (um perito, por exemplo), a fórmula é pública:
hash = SHA-256( hash_anterior + "\n" + json_canonico(registro) )Onde:
hash_anterioré o hash do evento anterior na cadeia, em 64 caracteres hexadecimais minúsculos. O primeiro evento da plataforma usa 64 zeros."\n"é uma quebra de linha (um único byte 0x0A).registroé o objeto com exatamente estes campos:conta_id,envelope_id,signatario_id,tipo,dados,ip,user_agent,geoeocorrido_em. O identificador sequencial do próprio evento não entra no cálculo.- O resultado é escrito em hexadecimal minúsculo.
JSON canônico#
json_canonico produz sempre o mesmo texto para o mesmo conteúdo:
- As chaves são ordenadas em ordem alfabética em todos os níveis (inclusive dentro de
dadosegeo). - Sem espaços nem quebras de linha entre os elementos.
- Caracteres acentuados e outros caracteres Unicode ficam como estão (não viram
\u00e7), e a barra/não é escapada. - Números inteiros saem como inteiros (
42, não"42"). - Campo ausente ou vazio sai como
null. ocorrido_emé um texto em UTC no formatoAAAA-MM-DD HH:MM:SS.uuuuuu(com seis casas de microssegundos).
Exemplo de verificação#
O trecho abaixo recalcula o hash de um evento a partir do hash anterior e dos campos do registro:
<?php
function ordenar($valor) {
if (!is_array($valor)) return $valor;
if (array_is_list($valor)) return array_map('ordenar', $valor);
ksort($valor, SORT_STRING);
return array_map('ordenar', $valor);
}
function hashEvento(string $hashAnterior, array $registro): string {
$canonico = json_encode(ordenar([
'conta_id' => $registro['conta_id'],
'envelope_id' => $registro['envelope_id'],
'signatario_id' => $registro['signatario_id'],
'tipo' => $registro['tipo'],
'dados' => $registro['dados'],
'ip' => $registro['ip'],
'user_agent' => $registro['user_agent'],
'geo' => $registro['geo'],
'ocorrido_em' => $registro['ocorrido_em'],
]), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
return hash('sha256', $hashAnterior . "\n" . $canonico);
}Para verificar uma sequência, comece pelo hash_anterior do primeiro evento do intervalo, recalcule cada evento em ordem e compare com o hash registrado. A primeira diferença aponta exatamente o registro alterado.
Ancoragem diária#
Uma vez por dia, o Ravisign pega o hash do último evento do dia anterior e obtém para ele um carimbo do tempo ICP-Brasil. O carimbo prova, por uma autoridade independente, que aquele hash (e, portanto, toda a cadeia até ele) já existia naquela data. O próprio carimbo é registrado na trilha como um evento ancoragem.
Com isso, mesmo que alguém com acesso total à plataforma tentasse recalcular a cadeia inteira a partir de um ponto, os hashes já ancorados nos dias anteriores deixariam de conferir com os carimbos emitidos.
Onde consultar a trilha#
- Painel: no detalhe do envelope, na seção Histórico, com IP e hash de cada evento.
- API: a ação
envelopes/eventosdevolve os eventos em ordem com o hash de cada um. Por privacidade, a API não devolve dados pessoais, IP nem navegador. Veja Envelopes na API. - Validador público: mostra o hash do último evento, o mesmo impresso no manifesto.
Dica para uma perícia que exija recalcular a cadeia com todos os campos, o titular da conta pode solicitar os registros completos do envelope ao suporte da Ravi Systems.
Retenção#
A trilha é prova: ela é mantida mesmo quando os documentos e os dados pessoais de uma conta são expurgados, pelo prazo necessário ao exercício regular de direitos. Veja Privacidade e segurança.
Fale com o suporte da Ravi Systems pelo e-mail abaixo.