Capítulo 11 — Criptografia e serviços de confiança: verificação
Mapa da aula
Aula 11 publicada. Mapa, exemplo, EX041.
flowchart TD
N0["11.1 Vetores de teste"]
N1["11.2 Verificar os callbacks"]
N2["Laboratório — Vetor de teste HMAC e verificação de c"]
N3["11.3 O que a aprovação prova"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4
N4 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX041"]
Desenho lógico
flowchart LR
N0["11.1 Vetores de teste"]
N1["11.2 Verificar os callbacks"]
N2["Laboratório — Vetor de teste HMAC e verificação de c"]
N3["11.3 O que a aprovação prova"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX041"]
[11.1 Vetores de teste]
|
v
[11.2 Verificar os callbacks]
|
v
[Laboratório — Vetor de teste HMAC e verificação de c]
|
v
[11.3 O que a aprovação prova]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX041]
Objetivos de aprendizagem
Você vai (1) verificar uma implementação contra um vetor de teste publicado; (2) verificar a autenticação de mensagens com comparação em tempo constante; (3) declarar o que um teste aprovado prova e o que não prova.
11.1 Vetores de teste
Antes de confiar em qualquer componente criptográfico, a Lumen o confere contra vetores de teste publicados: entradas fixas com saídas corretas conhecidas, impressas nas normas. A RFC 4231 lista vetores para o HMAC-SHA-256. Se o módulo hmac do Python, um equipamento de um fornecedor ou a biblioteca de um parceiro produzem a saída documentada para essas entradas, Tomás ganha confiança de que o algoritmo está corretamente ligado. Uma divergência significa que algo está errado, talvez a função de hash errada ou um erro na codificação da chave. Os vetores de teste conferem a correção da primitiva; eles não provam que as chaves estão protegidas nem que o protocolo ao redor é seguro.
11.2 Verificar os callbacks
O processador de pagamentos assina cada callback com HMAC-SHA-256 usando um segredo compartilhado com a Lumen. O portal recalcula o HMAC sobre o corpo recebido e o compara com o cabeçalho. Tomás aprende duas regras. Primeiro, comparar com hmac.compare_digest, que leva o mesmo tempo seja o primeiro ou o último byte que difere, e não com ==, que pode vazar informação pelo tempo. Segundo, incluir um carimbo de tempo nos dados assinados e rejeitar as mensagens antigas, para que um atacante não consiga repetir um callback capturado. O laboratório confere o vetor da RFC 4231 e depois verifica um callback sintético autêntico, um modificado e um antigo.
Laboratório — Vetor de teste HMAC e verificação de callbacks
# HMAC-SHA-256: RFC 4231 test case 1, then synthetic callback checks. Teaching only.
import hmac, hashlib
key = bytes.fromhex("0b" * 20); data = b"Hi There"
expected = "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7"
print("RFC 4231 TC1 match:", hmac.new(key, data, hashlib.sha256).hexdigest() == expected)
SECRET = b"synthetic-callback-secret"; NOW = 1_800_000_000; WINDOW = 300
def sign(ts, body): return hmac.new(SECRET, f"{ts}.".encode() + body, hashlib.sha256).hexdigest()
def verify(ts, body, tag):
return abs(NOW - ts) <= WINDOW and hmac.compare_digest(sign(ts, body), tag)
body = b'{"order":"LF-1042","status":"paid"}'
tag = sign(NOW - 20, body)
print("authentic:", verify(NOW - 20, body, tag))
print("edited body:", verify(NOW - 20, body.replace(b"paid", b"refunded"), tag))
old = NOW - 3600
print("stale replay:", verify(old, body, sign(old, body)))
Execute com python3 lab_hmac.py. Saída verificada:
RFC 4231 TC1 match: True
authentic: True
edited body: False
stale replay: False
11.3 O que a aprovação prova
Um teste verde é fácil de interpretar em excesso. Passar no vetor da RFC 4231 prova que o cálculo do HMAC está correto para aquela entrada. Passar no teste de callback prova que o portal rejeita um corpo adulterado e um carimbo de tempo antigo. Isso não prova que o segredo compartilhado está guardado com segurança, que todos os caminhos do código chamam a verificação nem que os próprios sistemas do processador são seguros. Tomás escreve cada resultado de verificação com seus limites declarados, para que os gestores não leiam uma única verificação aprovada como uma afirmação de que os pagamentos estão seguros de ponta a ponta.
Exemplo resolvido
Tomás executa o laboratório de HMAC, vê o vetor coincidir, o callback editado falhar e o callback antigo falhar e registra o resultado com seus limites declarados.
Caso sintético. O segredo do callback e os corpos são sintéticos; o caso de teste 1 da RFC 4231 é real.
Erros e limites
Os vetores de teste não cobrem canais laterais nem o manuseio das chaves. Uma janela de repetição longa demais enfraquece a verificação do carimbo de tempo.
Exercícios
-
EX041 — Propósito do vetor. O que coincidir com um vetor da RFC 4231 prova? Rubrica: 3 = o cálculo do HMAC está correto para aquelas entradas, não a segurança das chaves nem do protocolo;; 2 = correção;; 1 = segurança geral;; 0 = nenhuma.
-
EX042 — Razão do compare_digest. Por que usar hmac.compare_digest em vez de ==? Rubrica: 3 = a comparação em tempo constante evita vazar pelo tempo quantos bytes coincidem;; 2 = tempo;; 1 = nenhuma diferença;; 0 = nenhuma.
-
EX043 — Callback antigo. No laboratório, por que o terceiro callback foi rejeitado, embora sua etiqueta fosse válida? Rubrica: 3 = seu carimbo de tempo era mais antigo que a janela de 300 s, então foi tratado como repetição;; 2 = carimbo de tempo;; 1 = etiqueta errada;; 0 = nenhuma.
-
EX044 — Relatar os limites. Cite uma coisa que o teste de callback aprovado não prova. Rubrica: 3 = armazenamento do segredo, todos os caminhos do código chamando a verificação, ou segurança do provedor;; 2 = um item;; 1 = prova tudo;; 0 = nenhuma.
Síntese
A verificação combina vetores publicados, comparação correta e verificações de repetição e é relatada junto com o que deixa sem provar.
Continue estudando — aula 11 (capítulo 11 de 18)
← Capítulo 10 · Índice das aulas · Capítulo 12 →
Continue para a próxima aula já escrita.