Introdução à criptografia para desenvolvedores: o mínimo que você precisa saber
Criptografia não é mais um tópico exclusivo para especialistas em segurança. No cenário atual de desenvolvimento de software, onde violações de dados e vazamentos são frequentes, todo desenvolvedor precisa compreender os fundamentos criptográficos para proteger informações sensíveis. Este artigo apresenta o mínimo essencial que você precisa saber para evitar armadilhas comuns e implementar segurança básica em suas aplicações.
1. Fundamentos da Criptografia Moderna
Criptografia é a prática de transformar informações legíveis (texto claro) em um formato ilegível (texto cifrado) usando algoritmos matemáticos e chaves secretas. Para desenvolvedores, o conhecimento básico é crucial porque a segurança não pode ser uma reflexão tardia — ela deve ser incorporada desde o design da aplicação.
Existem dois grandes tipos de criptografia:
Criptografia Simétrica: usa a mesma chave para cifrar e decifrar. É rápida e eficiente para grandes volumes de dados, mas o desafio está em compartilhar a chave com segurança entre as partes. Use para criptografar dados em repouso (bancos de dados, arquivos).
Criptografia Assimétrica: usa um par de chaves (pública e privada). A chave pública cifra, a privada decifra. Ideal para troca segura de chaves e autenticação, mas é mais lenta. Use para estabelecer canais seguros e assinaturas digitais.
O gerenciamento de chaves é o calcanhar de Aquiles de qualquer sistema criptográfico. Chaves expostas em código-fonte, repositórios ou logs comprometem todo o sistema. Utilize cofres de chaves (HashiCorp Vault, AWS KMS) e nunca armazene chaves junto com os dados cifrados.
2. Algoritmos de Hash e Integridade de Dados
Funções hash criptográficas (SHA-256, SHA-3) geram uma impressão digital única de tamanho fixo a partir de qualquer entrada. São unidirecionais: não é possível reverter o hash para obter o dado original. Servem para verificar integridade de arquivos, mensagens e, com adaptações, armazenar senhas.
Nunca armazene senhas com hashes simples como SHA-256. Ataques de dicionário e rainbow tables quebram senhas fracas em segundos. Use funções de derivação de chave projetadas para senhas:
# Exemplo conceitual de hash de senha com bcrypt (pseudo-código)
senha = "minha_senha_segura"
hash = bcrypt.hashpw(senha, bcrypt.gensalt(rounds=12))
# Resultado: $2b$12$LJ3m... (contém salt e fator de custo)
- bcrypt: amplamente suportado, bom equilíbrio entre segurança e desempenho
- scrypt: consome muita memória, dificultando ataques com hardware especializado
- Argon2: vencedor do PHC (Password Hashing Competition), recomendado atualmente
Assinaturas digitais vs. HMAC: assinaturas usam criptografia assimétrica (chave privada assina, pública verifica). HMAC usa uma chave secreta compartilhada combinada com hash. Use HMAC para integridade entre sistemas que compartilham um segredo; use assinaturas digitais para autenticação de origem sem compartilhar chaves.
3. Criptografia Simétrica na Prática
AES (Advanced Encryption Standard) é o padrão atual. Com chaves de 128, 192 ou 256 bits, é considerado seguro quando usado corretamente. O modo de operação é tão importante quanto o algoritmo:
- CBC (Cipher Block Chaining): requer IV aleatório, não fornece autenticação — vulnerável a padding oracle attacks se mal implementado
- GCM (Galois/Counter Mode): fornece confidencialidade e autenticação integrada (AEAD), recomendado para a maioria dos casos
Exemplo conceitual de criptografia simétrica com AES-GCM:
# Criptografia AES-GCM (pseudo-código)
chave = "32_bytes_de_chave_segura_aqui!"
iv = os.urandom(12) # 96 bits para GCM
dados = "campo_sensivel_do_usuario"
texto_cifrado, tag = aes_gcm_encrypt(dados, chave, iv)
# tag autentica o ciphertext (16 bytes)
# Decifragem
dados_originais = aes_gcm_decrypt(texto_cifrado, chave, iv, tag)
Boas práticas para bancos de dados:
- Criptografe campos específicos (CPF, cartão de crédito), não a tabela inteira
- Use chaves diferentes por ambiente (dev, staging, prod)
- Implemente rotação periódica de chaves sem perder acesso aos dados históricos
- Considere criptografia determinística (AES-SIV) para campos que precisam ser indexados
4. Criptografia Assimétrica e Troca de Chaves
RSA e ECC (Curvas Elípticas) são os algoritmos assimétricos mais comuns. ECC oferece segurança equivalente com chaves muito menores (256 bits ECC ≈ 3072 bits RSA), resultando em melhor performance e menor overhead de rede.
Diffie-Hellman (ECDH): permite que duas partes estabeleçam uma chave secreta compartilhada mesmo em um canal inseguro. É a base do TLS/SSL que protege toda a web moderna.
Na prática, a criptografia híbrida combina o melhor dos dois mundos:
# Criptografia híbrida (pseudo-código)
# 1. Gera chave simétrica temporária
chave_simetrica = gerar_chave_aleatoria(32)
# 2. Cifra os dados com AES-GCM usando a chave simétrica
dados_cifrados = aes_gcm_encrypt(dados, chave_simetrica, iv)
# 3. Cifra a chave simétrica com a chave pública do destinatário
chave_cifrada = rsa_encrypt(chave_simetrica, chave_publica_destinatario)
# Transmite: iv + dados_cifrados + tag + chave_cifrada
Isso permite criptografar grandes volumes com performance da criptografia simétrica, enquanto gerencia chaves com a flexibilidade da assimétrica.
5. Criptografia em Trânsito e em Repouso
HTTPS/TLS: durante o handshake TLS, cliente e servidor negociam cifras, trocam certificados (X.509) e estabelecem uma chave de sessão via Diffie-Hellman. Sempre valide certificados no lado cliente — ignorar erros de validação anula a segurança.
Criptografia de disco vs. de aplicação: criptografia de disco (LUKS, BitLocker) protege contra roubo físico do hardware. Criptografia de aplicação protege contra acesso não autorizado ao banco de dados ou arquivos de backup. Para compliance (LGPD, PCI-DSS), ambos são frequentemente necessários.
APIs: além do TLS, criptografe payloads sensíveis com criptografia fim-a-fim quando dados transitam por intermediários (gateways, proxies). Headers como Authorization devem sempre trafegar sobre HTTPS.
6. Erros Comuns e Armadilhas para Desenvolvedores
Nunca implemente criptografia própria. Use bibliotecas testadas e auditadas: libsodium (recomendada), OpenSSL (com cuidado), ou wrappers modernos como Google Tink.
Geração de números aleatórios: use geradores criptograficamente seguros (os.urandom em Python, crypto.randomBytes em Node.js). IVs e nonces nunca devem ser reutilizados com a mesma chave — isso quebra completamente a segurança.
Ataques de tempo (timing attacks): comparações de strings/hashes devem usar comparação de tempo constante (hmac.compare_digest). Ataques de padding oracle exploram respostas do servidor sobre validade do padding — use modos autenticados (GCM, ChaCha20-Poly1305).
7. Compliance e Melhores Práticas Finais
A LGPD (Brasil) e GDPR (Europa) exigem proteção adequada de dados pessoais. Padrões como FIPS 140-2 e PCI-DSS definem requisitos específicos de criptografia para setores regulados.
Checklist mínimo para desenvolvedores:
- [ ] Use TLS 1.2+ para todas as comunicações externas
- [ ] Armazene senhas com Argon2id ou bcrypt (custo ≥ 10)
- [ ] Criptografe dados sensíveis em repouso com AES-256-GCM
- [ ] Nunca hardcode chaves — use gerenciadores de segredos
- [ ] Implemente rotação de chaves e certificados
- [ ] Use apenas bibliotecas criptográficas auditadas
Ferramentas recomendadas: libsodium (multilinguagem), Google Tink (Java, C++, Python), cryptography.io (Python), crypto/aes (Go).
A criptografia é uma ferramenta poderosa, mas apenas quando usada corretamente. Entender esses fundamentos permite que você construa aplicações mais seguras sem reinventar a roda — e sem comprometer dados dos usuários.
Referências
- OWASP Cryptographic Storage Cheat Sheet — Guia prático da OWASP sobre armazenamento criptográfico seguro, incluindo escolha de algoritmos e gerenciamento de chaves
- libsodium documentation — Documentação oficial da libsodium, biblioteca criptográfica moderna e segura recomendada para desenvolvedores
- NIST SP 800-175B: Guideline for Using Cryptographic Standards — Diretrizes do NIST sobre padrões criptográficos aprovados para uso em sistemas governamentais
- Cryptography Engineering: Design Principles and Practical Applications — Livro de Ferguson, Schneier e Kohno sobre princípios de engenharia criptográfica aplicada
- TLS Handshake Explained - Cloudflare — Explicação visual e detalhada do funcionamento do handshake TLS/SSL
- Argon2: The Password Hashing Competition Winner — Repositório oficial do Argon2 com especificações, implementações de referência e recomendações de uso