<a id="ch-07"></a>

## Capítulo 7 — Criptografia e serviços de confiança: controles e verificação

<!-- open-cyber-academy:lesson-figures:start ch-07 -->
### Mapa da aula

Aula 07 publicada. Mapa, exemplo, EX031.

```mermaid
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

```mermaid
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"]
```

```text
[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]
```
<!-- open-cyber-academy:lesson-figures:end ch-07 -->


### 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

```python
# 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:

```text
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? *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? *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? *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? *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ê? *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.

<!-- open-cyber-academy:chapter-navigation:start ch-07 -->
### Continue estudando — aula 07 (capítulo 07 de 12)

[← Capítulo 06](#ch-06) · [Índice das aulas](../SUBJECTS.md) · [Capítulo 08 →](#ch-08)

Continue para a próxima aula já escrita.
<!-- open-cyber-academy:chapter-navigation:end -->

## Worked answers

<a id="answer-ex031"></a>
**EX031.** Mensagens com mais de cinco minutos, 300 segundos, são rejeitadas como possíveis replays.

<a id="answer-ex032"></a>
**EX032.** Foi rejeitada, porque o HMAC recalculado deixou de corresponder à tag.

<a id="answer-ex033"></a>
**EX033.** Executando openssl s_client com a opção -tls1_1 e confirmando que o handshake é recusado.

<a id="answer-ex034"></a>
**EX034.** Ela a registra como não testada e explica por quê, em vez de presumir que corresponde aos outros endpoints.

<a id="answer-ex035"></a>
**EX035.** Palavras como seguro e conforme, porque afirmam mais garantia do que um teste específico oferece.
