Por que um checklist de decisão é necessário
Em organizações reais, a maior parte dos incidentes envolvendo criptografia não acontece por “falta de algoritmo forte”, e sim por inconsistência: times diferentes adotam padrões distintos, bibliotecas diferentes, parâmetros diferentes, e cada projeto “reinventa” decisões que deveriam ser repetíveis. Um checklist de decisão serve para transformar escolhas criptográficas em um processo operacional: previsível, auditável, com critérios claros de aceitação e com padrões recomendados que reduzem variação. O objetivo é que duas equipes, diante do mesmo cenário, cheguem a decisões equivalentes e compatíveis.
Este capítulo foca em como padronizar a adoção consistente: como decidir, como registrar, como validar e como manter. Não é um capítulo para reexplicar fundamentos de algoritmos, TLS, PKI, gestão de chaves ou armadilhas já cobertas; aqui, a ênfase é em governança técnica prática e em um conjunto de padrões recomendados para uso repetível.
Conceito: “decisão criptográfica” como artefato
Uma decisão criptográfica não é apenas “usar X”. Ela inclui: escopo (onde se aplica), requisitos (o que precisa garantir), dependências (bibliotecas, serviços, chaves), parâmetros (tamanhos, curvas, formatos), interoperabilidade (quem consome/produz), e operação (rotação, monitoramento, incidentes). Para adoção consistente, trate cada decisão como um artefato versionado, revisável e rastreável, semelhante a um padrão interno.
Componentes mínimos de um artefato de decisão
- Contexto e escopo: sistema, fluxo, dados, fronteiras de confiança, integrações.
- Requisitos não funcionais: performance, latência, custo, compatibilidade, restrições regulatórias.
- Padrão escolhido: primitivo/algoritmo, formato, parâmetros, bibliotecas aprovadas.
- Justificativa: por que esse padrão atende ao caso; por que alternativas foram descartadas.
- Critérios de aceitação: testes, validações, linting, scanners, evidências.
- Plano operacional: rotação, expiração, revogação, migração, observabilidade.
- Riscos residuais: o que fica de fora e como mitigar.
- Owner e revisão: responsável, periodicidade de revisão, gatilhos de atualização.
Checklist de decisão: passo a passo prático
A seguir, um passo a passo que pode ser aplicado em um ticket, ADR (Architecture Decision Record) ou documento de padrão interno. A ideia é que cada item gere uma resposta objetiva e verificável.
Passo 1 — Classifique o cenário de uso
Antes de escolher qualquer coisa, categorize o que você está tentando fazer. Isso evita “misturar” soluções.
Continue em nosso aplicativo
Você poderá ouvir o audiobook com a tela desligada, ganhar gratuitamente o certificado deste curso e ainda ter acesso a outros 5.000 cursos online gratuitos.
ou continue lendo abaixo...Baixar o aplicativo
- Transporte: proteger comunicação entre componentes.
- Armazenamento: proteger dados persistidos (banco, arquivo, objeto, backup).
- Identidade e autenticação: provar quem é quem (usuário, serviço, dispositivo).
- Integridade/assinatura: provar que algo não foi alterado e/ou foi produzido por um emissor.
- Tokenização/representação: representar permissões/identidade/dados de forma compacta e verificável.
- Derivação/segredo: produzir chaves/segredos a partir de material base (ex.: senha, chave mestre).
Regra prática: se o cenário envolve mais de uma categoria, separe em decisões menores. Exemplo: “API pública” normalmente envolve transporte (TLS), autenticação (tokens/certificados) e integridade (assinatura de artefatos ou mensagens). Cada uma deve ter seu padrão.
Passo 2 — Defina o perfil de interoperabilidade
Interoperabilidade determina formatos e restrições. Perguntas de checklist:
- Quem são os consumidores/produtores (serviços internos, parceiros, apps mobile, dispositivos)?
- Há legados que limitam versões/protocolos?
- O formato precisa ser padronizado (ex.: JOSE, CMS, OpenPGP) ou pode ser interno?
- Há necessidade de verificação offline (sem chamar um servidor)?
Exemplo prático: se você precisa que um parceiro valide assinaturas em múltiplas linguagens, um formato padronizado e bibliotecas amplamente suportadas reduzem risco de implementação divergente.
Passo 3 — Escolha um “perfil padrão” (baseline) e só então ajuste
Para consistência, defina perfis padrão por categoria (transporte, armazenamento, assinatura, tokens). O checklist aqui é: “Existe um perfil padrão aprovado que cobre este caso?” Se sim, use-o sem alterações. Se não, proponha um novo perfil e registre.
Perfis padrão devem ser poucos e bem documentados. Muitos perfis viram “cardápio” e perdem o objetivo.
Passo 4 — Fixe parâmetros e formatos (não deixe implícito)
Mesmo quando o algoritmo é “o mesmo”, parâmetros diferentes quebram compatibilidade e auditoria. Checklist:
- Tamanhos, curvas, versões, formatos de chave, encoding (PEM/DER/JWK), serialização (JSON/CBOR), canonicalização.
- Regras de validação: o que rejeitar (ex.: chaves fracas, parâmetros fora do perfil).
- Compatibilidade de bibliotecas: quais versões mínimas são suportadas.
Exemplo prático: se um token é JSON, defina canonicalização e ordenação de campos quando houver assinatura, para evitar falhas de verificação entre linguagens.
Passo 5 — Defina limites de tempo e rotação como parte do padrão
Consistência exige que “tempo” seja padronizado: validade, expiração, janelas de aceitação, e rotação. Checklist:
- Qual a validade máxima de credenciais/tokens/artefatos?
- Qual o período de rotação e o período de sobreposição (dual-read/dual-verify)?
- Como lidar com relógio incorreto (clock skew) e replays?
Exemplo prático: para tokens de acesso, padronize TTL curto e refresh controlado; para chaves de assinatura, padronize rotação com publicação antecipada de chave pública e janela de verificação de versões anteriores.
Passo 6 — Defina critérios de implementação segura e revisão
Checklist de implementação:
- Bibliotecas aprovadas e proibidas (por linguagem), com versões mínimas.
- Uso obrigatório de APIs de alto nível (evitar “montagem manual” de primitivas).
- Tratamento de erros: falhar fechado (fail-closed), mensagens de erro sem vazamento.
- Testes: vetores de teste, testes de interoperabilidade, testes negativos (inputs inválidos).
- Revisão: security review obrigatório para exceções ao padrão.
Exemplo prático: para uma assinatura em mensagens, exija testes que alterem 1 byte do payload e confirmem falha de verificação; exija também teste com chave errada e com algoritmo/“kid” inesperado.
Passo 7 — Defina observabilidade e evidências
Sem evidência, não há consistência. Checklist:
- Quais eventos serão logados (sem segredos): falha de verificação, expiração, algoritmo não permitido, versão de chave desconhecida.
- Métricas: taxa de falhas de validação, uso por versão de chave, tentativas de downgrade, rejeições por política.
- Alertas: picos de falha, uso de versão descontinuada, expiração próxima.
Exemplo prático: se você migra um padrão de token, acompanhe a métrica “% de tokens verificados por versão” para saber quando é seguro desativar a versão antiga.
Padrões recomendados: como estruturar um “Crypto Standard” interno
Em vez de listar dezenas de algoritmos, uma abordagem consistente é publicar um padrão interno com seções fixas e perfis. Abaixo está um modelo de estrutura e recomendações de conteúdo, para que a organização tenha um “manual de referência” que evolui com versionamento.
1) Matriz de perfis (por categoria)
Crie uma matriz curta com perfis aprovados. Cada perfil deve ter: nome, uso recomendado, bibliotecas aprovadas, parâmetros fixos, e critérios de validação. Exemplo de estrutura (não é uma lista exaustiva de algoritmos, e sim um formato de padronização):
Perfil: Transporte-Interno-Padrão v1 | Uso: tráfego serviço-a-serviço interno | Requisitos: mTLS, validação estrita, pinning opcional por ambiente | Evidências: scanner de configuração + testes de handshake negativosPerfil: Token-Acesso-Padrão v1 | Uso: autorização entre serviços e apps | Requisitos: TTL máximo, audience, issuer, key rotation | Evidências: testes de validação + métricas de versãoPerfil: Assinatura-Artefatos v1 | Uso: build/release | Requisitos: assinatura obrigatória, verificação no deploy | Evidências: logs de verificação + policy-as-codeO ganho aqui é que o time escolhe um perfil, não “um conjunto de opções”. Exceções viram novos perfis ou adendos, com revisão.
2) Catálogo de formatos e serialização
Padronize formatos para reduzir divergência:
- Chaves: formatos aceitos (ex.: PEM/DER/JWK), regras de armazenamento e transporte.
- Tokens: formato e campos obrigatórios, regras de canonicalização, limites de tamanho.
- Assinaturas: envelope, metadados, identificação de chave (kid), versionamento.
- Metadados de criptografia: como registrar versão de perfil, versão de chave, algoritmo permitido, data de criação.
Exemplo prático: para dados criptografados em repouso em formato próprio, defina um cabeçalho fixo com: versão do esquema, identificador de chave, algoritmo do perfil, e parâmetros necessários para decriptação. Isso evita “adivinhar” como decriptar no futuro.
3) Política de compatibilidade e descontinuação
Consistência ao longo do tempo exige regras de migração:
- Compatibilidade retroativa: por quanto tempo versões antigas são aceitas (verificação) após rotação/migração.
- Descontinuação: como anunciar e remover suporte a versões antigas.
- Janela de migração: métricas que determinam “pronto para cortar” (ex.: <1% de uso por 30 dias).
- Exceções: processo formal com prazo e owner.
Exemplo prático: ao mudar o perfil de token, mantenha verificação de duas versões por um período definido e registre no padrão a data limite para aceitar a versão antiga.
4) Padrão de “policy-as-code” para validação automática
Para adoção consistente, transforme regras em validações automáticas sempre que possível. Checklist do que automatizar:
- Validação de configurações (ex.: parâmetros permitidos, versões mínimas).
- Checagem de dependências (bibliotecas proibidas, versões vulneráveis).
- Validação de pipelines (ex.: artefato só promove se assinatura verificada).
- Testes de interoperabilidade em CI (ex.: gerar token em linguagem A e validar em linguagem B).
Exemplo prático: um repositório de “regras criptográficas” pode fornecer um pacote reutilizável que falha o build se detectar uso de um perfil descontinuado ou parâmetros fora do padrão.
Checklist operacional para adoção consistente (para times e revisores)
Use esta lista como “Definition of Done” para mudanças que envolvem criptografia. Ela é intencionalmente prática e verificável.
Checklist de design
- O caso de uso foi classificado (transporte/armazenamento/identidade/assinatura/token/derivação)?
- Foi escolhido um perfil padrão existente? Se não, foi criado um novo perfil com revisão?
- Interoperabilidade foi definida (quem consome/produz, formatos, versões)?
- Parâmetros e formatos foram fixados (sem defaults implícitos)?
- Há estratégia de versionamento (perfil e esquema de dados)?
Checklist de implementação
- Biblioteca aprovada e versão mínima documentadas.
- APIs de alto nível usadas; primitivas não foram “combinadas manualmente” sem justificativa.
- Validações estritas implementadas (rejeitar algoritmo inesperado, chave desconhecida, versão inválida).
- Testes positivos e negativos cobrindo: dados alterados, metadados alterados, expiração, chave errada, versão antiga.
- Erros não vazam detalhes sensíveis; falhas são fail-closed.
Checklist de operação
- Rotação e expiração definidas (com janela de sobreposição e rollback).
- Observabilidade definida: logs (sem segredos), métricas e alertas.
- Runbook de incidentes: o que fazer em caso de comprometimento de chave, falha massiva de validação, ou incompatibilidade.
- Plano de migração e descontinuação com datas e critérios.
Exemplos práticos de aplicação do checklist
Exemplo 1 — Padronizar tokens entre múltiplos serviços
Cenário: vários serviços internos em linguagens diferentes emitem e validam tokens. Problemas recorrentes: campos inconsistentes, validação parcial, e migrações dolorosas.
- Passo 1 (classificação): tokenização/identidade/autorização.
- Passo 2 (interoperabilidade): precisa funcionar em pelo menos 3 linguagens; validação offline em alguns serviços.
- Passo 3 (perfil): adotar “Token-Acesso-Padrão v1”.
- Passo 4 (parâmetros): definir campos obrigatórios (issuer, audience, subject, exp, iat, jti), regras de validação (audience exata, exp obrigatório, clock skew máximo), e identificação de chave (kid obrigatório).
- Passo 5 (tempo): TTL máximo padronizado; refresh via fluxo específico; rejeitar tokens sem exp.
- Passo 6 (implementação): bibliotecas aprovadas por linguagem; testes de interoperabilidade (emitir em A, validar em B e C); testes negativos (algoritmo inesperado, kid ausente).
- Passo 7 (observabilidade): métrica de falhas por motivo (expirado, audience inválida, assinatura inválida, kid desconhecido) e painel de migração por versão.
Resultado esperado: redução de variação entre serviços e migrações controladas via versionamento e métricas.
Exemplo 2 — Criptografia de payload em mensageria com versionamento de esquema
Cenário: mensagens em um tópico precisam ser protegidas e consumidas por múltiplos consumidores ao longo do tempo. O problema típico é perder a capacidade de decriptar mensagens antigas após mudanças.
- Passo 1: armazenamento/transporte de mensagens (na prática, proteção de payload persistido no broker e em replays).
- Passo 3: adotar “Payload-Protegido-Padrão v1”.
- Passo 4: definir envelope com cabeçalho: versão do esquema, id da chave, algoritmo do perfil, timestamp, e campos necessários para validação/decriptação.
- Passo 5: definir retenção e compatibilidade: consumidores devem suportar N versões do envelope; produtores sempre emitem a versão mais nova.
- Passo 6: testes de compatibilidade: consumidor v2 deve ler mensagens v1; testes negativos alterando cabeçalho e payload.
- Passo 7: métricas: % de mensagens por versão; alertas quando versão antiga ainda aparece após data de corte.
Resultado esperado: migração previsível e capacidade de auditoria do que está em produção.
Como lidar com exceções sem perder consistência
Exceções são inevitáveis (legado, parceiro, restrição de hardware). O problema é quando exceção vira regra informal. Padronize o processo:
- Exceção precisa de prazo: data de expiração e plano de migração.
- Exceção precisa de owner: responsável por manter e remover.
- Exceção precisa de compensações: controles adicionais (monitoramento, limitação de escopo, segmentação).
- Exceção precisa de rastreabilidade: ticket/ADR, revisão de segurança, e registro no inventário de padrões.
Exemplo prático: um parceiro exige um formato específico. Em vez de permitir “qualquer formato” no sistema, crie um perfil “Integração-Parceiro-X v1” com escopo restrito, gateway dedicado e métricas de uso, e mantenha o restante da plataforma no perfil padrão.
Template reutilizável (copie e preencha)
Use o template abaixo para registrar decisões e garantir que nada essencial fique implícito:
Nome da decisão/perfil: ____________________________ Versão: ________________ Data: ________________ Owner: ____________________
1) Escopo
- Sistemas/fluxos: ________________________________________________
- Produtores/consumidores: ________________________________________
- Dados envolvidos: _______________________________________________
2) Categoria do caso de uso
- ( ) Transporte ( ) Armazenamento ( ) Identidade ( ) Assinatura ( ) Token ( ) Derivação
3) Perfil adotado
- Perfil padrão existente? ( ) Sim ( ) Não
- Nome do perfil: _________________________________________________
- Exceções necessárias: ___________________________________________
4) Parâmetros e formatos fixos
- Formatos (chave/token/envelope): ________________________________
- Campos obrigatórios/metadados: __________________________________
- Regras de validação (rejeições): _________________________________
5) Tempo e ciclo de vida
- TTL/validade: __________________ Rotação: ______________________
- Janela de sobreposição: _________________________________________
6) Implementação
- Bibliotecas aprovadas e versões: _________________________________
- Testes (positivos/negativos/interoperabilidade): __________________
7) Operação e evidências
- Logs/métricas/alertas: __________________________________________
- Runbook e resposta a incidentes: _________________________________
- Plano de migração/descontinuação: ________________________________