◇ OpenCyber Academy
Graduação · Capítulo 8 · Português

Capítulo 8 — Programação II

Ensino gratuito e aberto para quem deseja proteger pessoas e tecnologias. Não é preciso criar uma conta para estudar ou consultar as respostas.

Capítulo 8 — Programação II

Mapa da aula

Aula 08 publicada. Mapa, exemplo, EX015.

flowchart TD
  N0["8.1 Estrutura e dados"]
  N1["8.2 Testes negativos"]
  N2["8.3 Lidar com segredos no código"]
  N3["8.5 Atividade prática"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4
  N4 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX015"]

Desenho lógico

flowchart LR
  N0["8.1 Estrutura e dados"]
  N1["8.2 Testes negativos"]
  N2["8.3 Lidar com segredos no código"]
  N3["8.5 Atividade prática"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX015"]
[8.1 Estrutura e dados]
    |
    v
[8.2 Testes negativos]
    |
    v
[8.3 Lidar com segredos no código]
    |
    v
[8.5 Atividade prática]
    |
    v
[Síntese]
    |
    v
[Exemplo resolvido] --> [Exercício EX015]

Objetivos de aprendizagem

Você vai (1) estruturar programas maiores com módulos, data classes e tratamento de erros; (2) interpretar entradas estruturadas, como CSV e JSON; (3) escrever testes tanto para entradas válidas quanto para inválidas; e (4) evitar erros de segurança comuns em código que lida com chaves.

8.1 Estrutura e dados

À medida que os programas crescem, a estrutura os mantém corretos. Agrupe as funções relacionadas em módulos, represente os registros com dataclasses para que os campos tenham nome e lance exceções para estados inválidos, em vez de devolver em silêncio valores errados. Os módulos csv e json da biblioteca padrão interpretam formatos comuns; validar cada campo ao lê-lo — tipo, faixa, valores permitidos — impede que dados ruins se propaguem. No trabalho de migração, os inventários chegam como exportações CSV de scanners e de bancos de dados de configuração, e a maioria dos erros de análise começa numa coluna não validada.

8.2 Testes negativos

Um teste positivo confere que uma entrada válida funciona; um teste negativo confere que uma entrada inválida é rejeitada. O código criptográfico precisa dos dois. Um decodificador de chaves de encapsulamento ML-KEM precisa aceitar exatamente 800, 1.184 ou 1.568 bytes para os três conjuntos de parâmetros da FIPS 203 e rejeitar qualquer outra coisa, e a FIPS 203 também especifica verificações de entrada sobre os coeficientes da chave. Bibliotecas que pularam essas verificações já aceitaram, historicamente, entradas malformadas que vazaram informações ou derrubaram serviços. Escreva os testes negativos antes de escrever o decodificador.

Os testes da HCU incluem chaves com um byte a menos e com um byte a mais.

8.3 Lidar com segredos no código

Mantenha os segredos fora dos logs, das mensagens de exceção e do controle de versão. Prefira passar handles de chaves (referências mantidas por um HSM ou pelo repositório de chaves do sistema operacional) em vez dos bytes brutos da chave. Compare segredos com funções de tempo constante. Nunca escreva a sua própria implementação de produção de um algoritmo pós-quântico; use uma biblioteca verificada e trate com desconfiança até um pequeno código de encapsulamento, porque os canais laterais e os bugs de interpretação vivem na cola tanto quanto no núcleo.

Para a HCU, isso significa chamar a biblioteca aprovada por uma pequena interface e revisar essa interface com o mesmo cuidado que todo o resto.

8.4 Exemplo resolvido

Um analista da HCU recebe inventory.csv com as colunas host, protocol, group. Um script descuidado conta as linhas em que group == "x25519" e relata "a maioria dos hosts é clássica". Uma versão cuidadosa normaliza as maiúsculas e minúsculas, rejeita as linhas com grupo vazio como desconhecidas em vez de clássicas e imprime três números: clássicos, híbridos e desconhecidos. O script cuidadoso revela que 18% das linhas sintéticas são desconhecidas — um fato que o primeiro script escondia.

Tratar o desconhecido como clássico teria feito o inventário parecer mais completo e mais uniformemente clássico do que era, escondendo os hosts cuja criptografia ninguém conhecia. Os desconhecidos se tornam uma lista de trabalho própria: alguém precisa verificar esses hosts diretamente antes que o inventário possa ser confiável. O script cuidadoso também registra a data do arquivo de entrada, para que os leitores posteriores saibam quão recentes são as contagens.

8.5 Atividade prática

Escreva uma função que leia linhas host,group, valide que group pertence a um conjunto permitido e devolva as contagens de híbridos, clássicos e desconhecidos. Inclua um teste negativo com uma cadeia de grupo desconhecida.

Normalize as maiúsculas e minúsculas e os espaços antes de comparar e decida de antemão o que conta como híbrido. Um nome de grupo que você nunca viu deve cair em desconhecido, nunca em clássico por padrão. O seu teste negativo deve mostrar que um nome de grupo escrito errado ou inventado é contado como desconhecido e que a função não quebra diante de uma linha vazia. Imprima as três contagens numa ordem fixa, para que as saídas de execuções diferentes possam ser comparadas.

8.6 Erros comuns e limites

Os dados ausentes são um resultado sobre o inventário, e não sobre os sistemas. Engolir exceções esconde as linhas que falharam, então os totais parecem completos quando não estão; registre cada falha com o número da linha. A criptografia própria falha de maneiras que os testes raramente detectam, como diferenças de tempo, e as bibliotecas verificadas tiveram anos de revisão que uma implementação nova não consegue igualar.

Exercícios

Síntese

Código estruturado, entradas validadas e testes negativos tornam a análise confiável; no código criptográfico, rejeitar uma entrada ruim é tão importante quanto tratar uma entrada boa.

Continue estudando — capítulo 08 de 40

← Capítulo 07 · Índice de capítulos do curso · Capítulo 09 →

Siga para a próxima lição escrita.