Mapa da aula
Aula 07 publicada. Mapa, exemplo, EX031.
flowchart TD
N0["7.1 Verificando as notificações"]
N1["Laboratório — Verificação de notificações"]
N2["7.2 Verificando as configurações de TLS"]
N3["Síntese"]
N0 --> N1 --> N2 --> N3
N3 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX031"]
Desenho lógico
flowchart LR
N0["7.1 Verificando as notificações"]
N1["Laboratório — Verificação de notificações"]
N2["7.2 Verificando as configurações de TLS"]
N3["Síntese"]
N0 --> N1 --> N2 --> N3 --> Q["EX031"]
[7.1 Verificando as notificações]
|
v
[Laboratório — Verificação de notificações]
|
v
[7.2 Verificando as configurações de TLS]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX031]
Objetivos de aprendizagem
Você vai (1) verificar os controles das notificações de pagamento com HMAC e verificações de replay; (2) verificar as configurações de TLS contra uma linha de base; (3) escrever declarações de verificação com seus limites.
7.1 Verificando as notificações
O site de agendamento da Bayside recebe notificações de pagamento do processador. Cada uma traz uma tag HMAC-SHA-256 calculada com um segredo compartilhado sobre um carimbo de tempo e o corpo da mensagem. O código da agência deve recalcular a tag, compará-la com hmac.compare_digest e rejeitar qualquer mensagem com mais de cinco minutos. Dana não tem permissão para testar o processador em produção, então verifica a lógica num laboratório com mensagens sintéticas: uma autêntica, uma com o valor alterado e uma repetida depois de uma hora. O laboratório abaixo mostra o verificador aceitando apenas a mensagem autêntica, o que corresponde ao comportamento descrito pela agência.
Laboratório — Verificação de notificações
# Verify synthetic payment notifications: HMAC-SHA-256 + 300 s replay window.
import hmac, hashlib
SECRET = b"synthetic-processor-secret"; NOW = 1_772_000_000; WINDOW = 300
def tag(ts, body): return hmac.new(SECRET, str(ts).encode() + b"." + body, hashlib.sha256).hexdigest()
def accept(ts, body, t): return NOW - ts <= WINDOW and hmac.compare_digest(tag(ts, body), t)
body = b'{"booking":"BDG-2207","amount":"85.00"}'
t = tag(NOW - 30, body)
print("authentic:", accept(NOW - 30, body, t))
print("changed amount:", accept(NOW - 30, body.replace(b"85.00", b"8.50"), t))
print("replayed after 1 h:", accept(NOW - 3600, body, tag(NOW - 3600, body)))
Execute com python3 lab_notify.py. Saída verificada:
authentic: True
changed amount: False
replayed after 1 h: False
7.2 Verificando as configurações de TLS
Para o TLS, Dana confere cada endpoint do escopo contra a linha de base: TLS 1.3 oferecido, TLS 1.2 permitido apenas se necessário, versões mais antigas recusadas, cadeia completa servida e nome do certificado correto. Ela usa openssl s_client com opções explícitas de versão, por exemplo tentando -tls1_1 e esperando uma recusa. Cada teste registra o comando, o resultado e o horário. Onde um cliente não pode ser testado diretamente, como uma antiga estação de trabalho de imagens odontológicas, ela registra a lacuna com honestidade em vez de presumir que ela se comporta como as demais. Uma verificação é tão forte quanto os casos de fato testados.
7.3 Declarações com limites
Dana escreve as declarações de verificação numa forma fixa: o que foi verificado, como, quando, o resultado e o que não foi verificado. Por exemplo: a lógica de verificação das notificações aceitou mensagens sintéticas autênticas e rejeitou as alteradas e as repetidas num laboratório em 3 de março; o caminho do código de produção e o armazenamento do segredo não foram revisados. Essa forma protege tanto a Copperleaf quanto o cliente. Os clientes tomam decisões com base nessas declarações, então uma declaração que esconde seus limites pode levá-los a dispensar uma revisão necessária. Marcus confere cada declaração em busca de palavras como seguro ou conforme, que afirmam mais do que o teste mostrou.
Exemplo resolvido
Dana executa o laboratório de notificações, testa as versões de TLS em três endpoints e escreve quatro declarações de verificação, cada uma terminando com o que não foi verificado.
Caso sintético. As mensagens, os segredos e os endpoints são sintéticos.
Erros e limites
Verificações da lógica em laboratório não provam que o código de produção corresponde a ela. A recusa de uma versão antiga não prova que todas as opções fracas estão desativadas.
Exercícios
-
EX031 — Janela de replay. Que limite de idade o verificador impõe às notificações?
Mostrar critérios de avaliação
Rubrica: 3 = cinco minutos (300 segundos);; 2 = cinco minutos;; 1 = vago;; 0 = nenhuma. -
EX032 — Valor alterado. O que o laboratório relatou para a notificação com valor alterado?
Mostrar critérios de avaliação
Rubrica: 3 = rejeitada (False) porque a tag deixou de corresponder;; 2 = rejeitada;; 1 = aceita;; 0 = nenhuma. -
EX033 — Sondagem do TLS 1.1. Como Dana verifica que o TLS 1.1 é recusado?
Mostrar critérios de avaliação
Rubrica: 3 = openssl s_client com -tls1_1, esperando falha no handshake;; 2 = comando;; 1 = presume;; 0 = nenhuma. -
EX034 — Estação de imagens. O que Dana faz quanto à estação de imagens que não pode ser testada?
Mostrar critérios de avaliação
Rubrica: 3 = registra a lacuna com honestidade em vez de presumir;; 2 = registra a lacuna;; 1 = presume que está bem;; 0 = nenhuma. -
EX035 — Palavras proibidas. Que palavras Marcus procura nas declarações, e por quê?
Mostrar critérios de avaliação
Rubrica: 3 = seguro ou conforme, porque afirmam mais do que os testes mostram;; 2 = palavras citadas;; 1 = vago;; 0 = nenhuma.
Síntese
A verificação prova um comportamento específico sob testes específicos, e declarações honestas dizem exatamente que casos foram testados.