MÓDULO 3.3

🔐 Criptografia e Proteção de Segredos

Fernet + PBKDF2, UUID do hardware como chave, armazenamento seguro em ~/.intelecto/.secrets e audit log imutável.

6
Tópicos
75
Minutos
Avançado
Nível
Técnico
Tipo
1

🔑 Fernet — Criptografia Simétrica

Fernet é a solução mais segura e simples para criptografia de dados em repouso em Python. AES-128-CBC para cifrar, HMAC-SHA256 para autenticar — você não pode descriptografar sem também verificar a integridade.

📌 Por que Fernet é a Escolha Certa

Comparação com alternativas:

  • Texto plano: chave visível em qualquer editor de texto — inaceitável
  • Base64: não é criptografia, é apenas encoding — ainda exposto
  • AES puro: requer gerenciar IV, padding, modo de operação — error-prone
  • Fernet: uma linha de código, semanticamente seguro, autenticado — ideal

💡 Dica Prática

Sempre use from cryptography.fernet import Fernet. Nunca implemente criptografia própria — a biblioteca cryptography foi auditada por especialistas de segurança.

2

🔗 PBKDF2 — Derivação de Chave

PBKDF2 transforma qualquer valor (como o UUID do hardware) em uma chave criptográfica robusta. As muitas iterações tornam brute-force computacionalmente inviável.

📌 Parâmetros de PBKDF2

Configurações recomendadas para 2026:

  • Hash: SHA-256 (o padrão mais seguro disponível)
  • Iterations: mínimo 600.000 para uso em hardware moderno
  • Salt: 32 bytes aleatórios, armazenado junto com o hash
  • Length: 32 bytes (256 bits) para usar como chave AES-256
  • Library: hashlib.pbkdf2_hmac() — nativo do Python

💡 Dica Prática

Use 600.000+ iterações (recomendação OWASP 2024). Parece alto mas leva ~0.3 segundos no hardware moderno — aceitável para unlock de chave.

3

💻 UUID do Hardware como Chave

O UUID do hardware é único por máquina e imutável durante a vida útil do hardware. Usá-lo como material para PBKDF2 cria criptografia ligada à máquina específica.

📌 Como Obter o UUID do Hardware

Método multiplataforma para obter UUID:

  • Linux: cat /sys/class/dmi/id/product_uuid ou dmidecode -s system-uuid
  • macOS: ioreg -rd1 -c IOPlatformExpertDevice | grep UUID
  • Windows: wmic csproduct get UUID
  • Fallback: gerar UUID determinístico baseado em múltiplos identificadores de hardware

💡 Dica Prática

Teste o UUID antes de criptografar dados importantes. Se o UUID mudar após uma atualização de BIOS ou troca de hardware, seus segredos ficarão inacessíveis sem backup da chave original.

4

📁 Armazenamento em ~/.intelecto/.secrets

O arquivo ~/.intelecto/.secrets é onde as chaves cifradas vivem. Formato JSON simples, permissões restritivas e localização oculta por convenção.

📌 Estrutura do .secrets

Formato do arquivo de segredos:

  • {"OPENROUTER_API_KEY": "gAAA...token_fernet..."}
  • Cada chave: nome do segredo
  • Cada valor: token Fernet cifrado (começa com gAAA)
  • chmod 600: apenas o dono pode ler e escrever
  • .gitignore: ~/.intelecto/ deve estar no gitignore global

💡 Dica Prática

Configure um gitignore global (~/.gitignore_global) que exclui ~/.intelecto/ de qualquer repositório. Um acidente de git add . não deve vazar seus segredos.

5

📋 audit.log — Registro Imutável

O audit.log é a memória forense do INTELECTO. Cada ação significativa é registrada de forma append-only — o log só cresce, nunca tem linhas deletadas ou alteradas.

📌 Formato do Audit Log

Cada linha do log é um JSON estruturado:

  • {"ts": "2026-04-28T10:30:00Z", "user": "telegram:123", "action": "exec", "tool": "shell", "cmd": "ls -la", "result": "ok"}
  • ts: timestamp ISO 8601 com timezone
  • user: identificador do canal e usuário
  • action: tipo de ação (read, exec, deny, error)
  • tool: qual tool foi chamada (se aplicável)
  • result: ok, denied, error

💡 Dica Prática

Configure logrotate para o audit.log com a opção nocreate — preserva o arquivo original. Comprima logs antigos mas nunca delete. São evidência forense.

6

🔄 Rotação de Chaves

Chaves de API devem ser rotacionadas periodicamente. O secrets.py suporta múltiplas chaves com precedência para permitir rotação sem downtime.

📌 Processo de Rotação

Rotação sem interrupção de serviço:

  • 1. Gerar nova chave Fernet
  • 2. Re-criptografar segredos com a nova chave
  • 3. Configurar: current_key = nova, fallback_key = antiga
  • 4. Testar que serviço funciona com nova chave
  • 5. Após 24h de estabilidade: remover fallback_key
  • 6. Registrar a rotação no audit.log

💡 Dica Prática

Agende rotação automática de chaves com cron: uma vez por trimestre para uso pessoal, mensalmente para uso com dados sensíveis. O INTELECTO tem o script rotate_keys.py pronto.

Resumo do Módulo 3.3

Fernet — Criptografia Simétrica — AES-128-CBC + HMAC-SHA256 em uma API simples — a escolha correta para secrets
PBKDF2 — Derivação de Chave — 600k+ iterações, salt aleatório, SHA-256 — derivação de chave robusta do UUID do hardware
UUID do Hardware como Chave — UUID único por máquina + PBKDF2 = criptografia que só funciona no hardware original
Armazenamento em ~/.intelecto/.secrets — JSON com tokens Fernet, chmod 600, localização oculta e fora de qualquer repo git
audit.log — Registro Imutável — JSON estruturado, append-only, com timestamp, usuário, ação e resultado — evidência forense imutável
Rotação de Chaves — Multi-key com precedência permite rotação zero-downtime em 6 etapas

Próximo:

3.4 — IronClaw Zero-Trust