Pular para o conteúdo

Criptografia e chaves

Simétrica, autenticada, assimétrica, hashing, assinatura e o ciclo de vida da chave — com o que existe aqui e o que não existe.

Criptografia erra em silêncio: o programa roda, o arquivo fica cifrado, e a falha só aparece quando alguém tenta explorá-la. Esta página diz o que a linguagem oferece, e — com a mesma clareza — o que ela não oferece.

O que existe#

CategoriaAquiObservação
Cifra autenticada (AEAD)ChaCha20-Poly1305, RFC 8439 — Crypto.cifrara etiqueta vem junto: adulterar um byte é recusa, não texto ilegível
Cifra simétrica purasó via AEADoferecer ChaCha20 ou AES sem autenticação seria oferecer a forma de errar
AESnão existeo ChaCha20 é mais rápido em software sem AES-NI e mais difícil de implementar errado
ResumoSHA-2, SHA-3, BLAKE2 — Crypto.algorithms()MD5 e SHA-1 existem para checksum, e o linter acusa o uso em assinatura
HMACCrypto.hmac, hmac_verifyintegridade e origem entre duas partes
Senha derivadascrypt (padrão) e PBKDF2ver Autenticação
Assimétrica (RSA, ECC, Ed25519)não existeem Python puro é lenta e é onde um erro vira falha silenciosa
Assinatura com não-repúdionão existeconsequência da linha acima — HMAC não serve
TLSo ssl do Python; no Kiln, um nginx na frenteRede.certificado_de inspeciona um certificado
AleatoriedadeCrypto.random_bytes, random_tokenos.urandom; randint não serve para segredo

A chave tem ciclo de vida#

Crypto gera bytes e cifra com eles. O que faltava era o resto: de onde a chave veio, até quando vale, para que serve, e o que fazer com o dado cifrado pela versão anterior. Sem isso, o que acontece é sempre o mesmo — uma chave nasce numa variável de ambiente, é usada para tudo, e nunca é trocada.

dataforge
adopt Arcane.Chaves as Ch

cofre := Ch.cofre()
cofre.gerar("mestra", proposito := "cifrar")

envelope := cofre.envelopar("um terabyte de dados", "mestra")

// Rotacionar nao torna ilegivel o passado: o envelope carrega o
// 'kid', e a chave aposentada continua abrindo o que ela fechou.
nova := cofre.rotacionar("mestra", "cifrar")
assert cofre.desenvelopar(envelope) isnt void

// E recifrar troca a chave sem tocar nos DADOS — so na DEK.
assert cofre.recifrar(envelope, "mestra")["kid"] is nova.kid

out "rotacionado, e o passado continua legivel"
DecisãoSem ela
a chave tem propósitoa que assina token também decifra arquivo, e um comprometimento vira todos
a rotação mantém as antigastrocar a chave torna ilegível o que já foi cifrado — então ninguém troca
o dado carrega o `kid`na hora de decifrar não se sabe qual das cinco chaves usar
o material não aparece em textoo vazamento mais comum é alguém imprimir o objeto para depurar

Gestão de segredo#

PerguntaResposta aqui
onde o segredo morano ambiente, e nunca no repositório — dataforge seguranca acusa
como ele não vaza em logSeg.segredo (opaco) e Seg.redigir
como se guarda o cofrecofre.exportar(senha) devolve cifrado; gravar é de quem chama
como se sabe que é hora de trocarcofre.precisa_rotacionar()
cofre externo (Vault, KMS, Secrets Manager)não há integração — é serviço, e cada um tem a sua API

Referência: Arcane.Chaves e Arcane.Crypto.