Como Implementar Criptografia AES em Python para Proteger Dados em Repouso
A proteção de dados em repouso (data at rest) é um dos pilares mais críticos da segurança da informação moderna, sendo exigida por regulamentações como LGPD, GDPR e padrões do setor financeiro. Armazenar informações sensíveis sem criptografia adequada expõe bancos de dados, backups e arquivos de configuração a vazamentos irreversíveis caso o perímetro de rede seja comprometido.
Contudo, a simples escolha do algoritmo AES (Advanced Encryption Standard) não garante proteção automática. Falhas comuns como o reúso de vetores de inicialização (IV), armazenamento estático de chaves no código-fonte e o uso de modos de operação obsoletos (como ECB ou CBC sem autenticação) transformam implementações caseiras em brechas de segurança. Neste artigo, abordamos a arquitetura de uma solução robusta e pronta para produção em Python utilizando AES-GCM.
Por que Utilizar AES-GCM?
Ao proteger dados em repouso, precisamos garantir duas propriedades essenciais: confidencialidade (ninguém além de sistemas autorizados lê a informação) e integridade (qualquer alteração no dado cifrado é detectada imediatamente).
O modo AES-GCM (Galois/Counter Mode) é o padrão da indústria para criptografia autenticada com dados associados (AEAD). Ele oferece:
- Autenticação integrada: Gera uma tag de autenticação que impede ataques de modificação de texto cifrado (ciphertext tampering).
- Desempenho elevado: Permite paralelização de operações e tira proveito de acelerações de hardware presentes em processadores modernos (instruções AES-NI).
Implementação Técnica com a Biblioteca Cryptography
Para uma solução de nível corporativo, não implementamos primitivas criptográficas do zero. Utilizamos a biblioteca cryptography, mantida pela comunidade e auditada regularmente.
1. Instalação de Dependências
bash
pip install cryptography
2. Módulo de Criptografia Pronta para Produção
Abaixo está uma classe utilitária que encapsula a geração segura de vetores de inicialização (nonces), cifragem, decifragem e empacotamento do resultado.
python
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from typing import Tuple
class SecureDataCipher:
def init(self, masterkey: bytes = None):
# Uma chave de 256 bits (32 bytes) para máxima segurança
self.key = masterkey or AESGCM.generatekey(bitlength=256)
self.aesgcm = AESGCM(self.key)
def encrypt(self, plaintext: bytes, associated_data: bytes = None) -> bytes:
"""
Cifra dados usando AES-256-GCM gerando um nonce único de 96 bits (12 bytes).
Retorna a concatenação de nonce + ciphertext (que inclui a tag de autenticação).
"""
# O nonce NUNCA deve ser reutilizado com a mesma chave
nonce = os.urandom(12)
ciphertext = self.aesgcm.encrypt(nonce, plaintext, associated_data)
return nonce + ciphertext
def decrypt(self, payload: bytes, associated_data: bytes = None) -> bytes:
"""
Separa o nonce do ciphertext e executa a decifragem autenticada.
Lança exceção se os dados tiverem sido corrompidos ou adulterados.
"""
if len(payload) < 28: # 12 bytes de nonce + 16 bytes mínimos de tag
raise ValueError("Carga de dados inválida ou incompleta.")
nonce = payload[:12]
ciphertext = payload[12:]
return self.aesgcm.decrypt(nonce, ciphertext, associated_data)
3. Exemplo Prático de Execução
python
if name == “main“:
# Em produção, a chave deve vir de um HSM, AWS KMS ou variável de ambiente segura
cipher = SecureDataCipher()
dado_sensivel = b"Credenciais: host=db.internal;user=admin;pass=Secret123;"
dados_contexto = b"tenant_id_9481"
# Cifragem
dados_cifrados = cipher.encrypt(dado_sensivel, associated_data=dados_contexto)
print(f"Dado cifrado gravado no disco (bytes): {len(dados_cifrados)}")
# Decifragem
dado_recuperado = cipher.decrypt(dados_cifrados, associated_data=dados_contexto)
print(f"Dado recuperado com sucesso: {dado_recuperado.decode('utf-8')}")
Boas Práticas para Arquiteturas de Produção
Como especialista em IA e engenharia de software, frequentemente desenho pipelines onde modelos acessam grandes volumes de dados regulados. Para garantir conformidade e performance em escala, considere as seguintes diretrizes:
- Gerenciamento de Chaves (KMS): Nunca grave chaves criptográficas em arquivos de configuração ou repositórios Git. Integre o módulo a serviços como AWS KMS, Google Cloud KMS ou HashiCorp Vault utilizando a técnica de Envelope Encryption (onde uma chave mestra protege chaves de dados efêmeras).
- Isolamento de Tenants com Associated Data: No código acima, o parâmetro
associated_datavincula metadados (como o ID da organização) ao bloco criptografado sem cifrá-los, impedindo que um payload de um cliente seja decifrado e aplicado ao contexto de outro. - Rotação de Chaves: Estruture o payload armazenado com um prefixo de versão (por exemplo,
v1$nonce$ciphertext). Dessa forma, a aplicação sabe qual versão da chave utilizar durante ciclos graduais de rotação.
Conclusão e Próximos Passos
Implementar criptografia AES para dados em repouso vai além de chamar uma função de biblioteca. Demanda rigor na escolha de modos autenticados, gestão de ciclos de vida de chaves e otimização de I/O para evitar gargalos na stack da aplicação.
Se sua empresa precisa desenhar uma arquitetura de proteção de dados, estruturar pipelines seguros para IA ou validar a conformidade de sua infraestrutura com as melhores práticas de engenharia de software, entre em contato para estruturarmos uma consultoria técnica sob medida.


