Fundamentos de Criptografia - Chaves Simetricas vs Assimetricas: O que Todo Desenvolvedor Precisa Saber
Se voce nao sabe como AES, RSA e HTTPS funcionam, leia este artigo. Conceitos essenciais de criptografia explicados com exemplos praticos.
Toolypet Team
Development Team
Fundamentos de Criptografia: Chaves Simetricas vs Assimetricas
"Por favor, criptografe esses dados e envie."
Quando voce ouve isso, sabe exatamente o que fazer e como?
Existem dois tipos principais de criptografia. Se voce nao sabe quando usar cada um, seu design de seguranca pode estar incorreto.
Criptografia vs Hashing
Primeiro, vamos esclarecer esses conceitos frequentemente confundidos.
| Criptografia | Hashing | |
|---|---|---|
| Direcao | Bidirecional (descriptografavel) | Unidirecional (irreversivel) |
| Proposito | Protecao de dados | Verificacao de integridade, armazenamento de senhas |
| Requer chave | Sim | Nao |
| Exemplos | AES, RSA | SHA-256, bcrypt |
Criptografia: Os dados originais podem ser recuperados Hashing: Os dados originais nao podem ser recuperados
Use hashing para armazenar senhas, criptografia para transmitir dados.
Criptografia de Chave Simetrica
Conceito
Criptografa com uma chave, descriptografa com a mesma chave.
Texto plano + Chave → Criptografar → Texto cifrado
Texto cifrado + Chave → Descriptografar → Texto plano
Exemplo: Uma Fechadura
Pense na chave da sua casa. Voce tranca e destranca com a mesma chave.
Algoritmos Comuns
| Algoritmo | Tamanho da Chave | Status |
|---|---|---|
| AES-256 | 256bit | Padrao atual |
| AES-128 | 128bit | Seguro |
| 3DES | 168bit | Legado |
| DES | 56bit | Vulneravel |
Exemplo de Codigo (Node.js)
const crypto = require('crypto');
// Gerar chave (armazenar com seguranca em producao)
const key = crypto.randomBytes(32); // AES-256
const iv = crypto.randomBytes(16); // Vetor de inicializacao
// Criptografar
function encrypt(text) {
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
let encrypted = cipher.update(text, 'utf8', 'hex');
encrypted += cipher.final('hex');
return encrypted;
}
// Descriptografar
function decrypt(encrypted) {
const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
const secret = "dados sensiveis";
const encrypted = encrypt(secret);
const decrypted = decrypt(encrypted);
console.log(encrypted); // "a3f8b2c1..."
console.log(decrypted); // "dados sensiveis"
Vantagens e Desvantagens
| Vantagens | Desvantagens |
|---|---|
| Rapido | Problema de compartilhamento de chave |
| Adequado para grandes volumes | Se a chave for exposta, fim de jogo |
| Implementacao simples | Gerenciamento de chaves complexo |
O Problema de Compartilhar a Chave
Se A quer enviar uma mensagem criptografada para B, A deve entregar a chave para B primeiro.
Mas como entregar essa chave de forma segura?
A criptografia de chave assimetrica resolve esse problema.
Criptografia de Chave Assimetrica
Conceito
Usa duas chaves:
- Chave Publica (Public Key): Qualquer pessoa pode conhecer
- Chave Privada (Private Key): Nunca deve ser compartilhada
Criptografar com chave publica → Somente a chave privada pode descriptografar
Assinar com chave privada → Verificar com chave publica
Exemplo: Uma Caixa de Correio
- Chave publica = Caixa de correio (qualquer pessoa pode deixar uma carta)
- Chave privada = Chave da caixa de correio (somente o dono pode retirar as cartas)
Algoritmos Comuns
| Algoritmo | Uso | Tamanho da Chave |
|---|---|---|
| RSA | Criptografia, assinatura | 2048+ bit |
| ECDSA | Assinatura | 256+ bit |
| Ed25519 | Assinatura | 256bit |
Exemplo de Codigo (Node.js RSA)
const crypto = require('crypto');
// Gerar par de chaves
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
modulusLength: 2048,
});
// Criptografar com chave publica
function encryptWithPublic(text) {
return crypto.publicEncrypt(publicKey, Buffer.from(text)).toString('base64');
}
// Descriptografar com chave privada
function decryptWithPrivate(encrypted) {
return crypto.privateDecrypt(privateKey, Buffer.from(encrypted, 'base64')).toString();
}
const secret = "dados sensiveis";
const encrypted = encryptWithPublic(secret);
const decrypted = decryptWithPrivate(encrypted);
console.log(decrypted); // "dados sensiveis"
Assinaturas Digitais
Quando voce assina com uma chave privada, qualquer pessoa pode verificar quem assinou usando a chave publica.
// Assinar com chave privada
const sign = crypto.createSign('SHA256');
sign.update('mensagem');
const signature = sign.sign(privateKey, 'base64');
// Verificar com chave publica
const verify = crypto.createVerify('SHA256');
verify.update('mensagem');
const isValid = verify.verify(publicKey, signature, 'base64');
console.log(isValid); // true
Vantagens e Desvantagens
| Vantagens | Desvantagens |
|---|---|
| Resolve o problema de compartilhamento de chave | Lento (1000x mais lento que simetrico) |
| Permite assinaturas digitais | Nao adequado para grandes dados |
| A chave publica pode ser distribuida livremente | Tamanhos de chave maiores |
Na Pratica: Usando Ambos Juntos (Criptografia Hibrida)
E assim que o HTTPS funciona.
Processo
1. Servidor: Gera par de chaves RSA publica/privada
2. Cliente: Recebe a chave publica do servidor
3. Cliente: Gera chave de sessao AES
4. Cliente: Criptografa chave de sessao com RSA publica → Envia ao servidor
5. Servidor: Descriptografa chave de sessao com RSA privada
6. Ambos: Comunicam-se usando a chave de sessao AES
Por Que Fazer Assim
- RSA: Usado apenas para troca de chaves (lento mas seguro)
- AES: Usado para criptografia real de dados (rapido)
Usando o melhor de ambos os mundos.
Lista de Verificacao Pratica
Ao Usar Chaves Simetricas (AES)
- Usar AES-256 ou AES-128
- Gerar novo IV (vetor de inicializacao) para cada criptografia
- Armazenar chaves em variaveis de ambiente ou KMS
- Nunca usar modo ECB (usar CBC, GCM em vez disso)
Ao Usar Chaves Assimetricas (RSA)
- Usar minimo chaves de 2048bit
- Nunca expor chaves privadas
- Usar preenchimento OAEP (evitar PKCS#1 v1.5)
- Estabelecer politica de rotacao de chaves
Perguntas Frequentes
P: Devo criptografar chaves de API para armazenamento?
R: Use variaveis de ambiente ou ferramentas de gerenciamento de segredos (AWS Secrets Manager, HashiCorp Vault) em vez de criptografia. Mesmo com criptografia, voce ainda tem o problema de gerenciar a chave de descriptografia.
P: Criptografar no lado do cliente e seguro?
R: Nao. O codigo do cliente e visivel para todos, expondo a chave. A criptografia sensivel deve ser feita no servidor.
P: SHA-256 e criptografia?
R: Nao. SHA-256 e hashing. Nao pode ser descriptografado. Se voce precisa recuperar dados, use criptografia como AES.
Resumo
| Cenario | Algoritmo |
|---|---|
| Criptografia de grandes dados | AES-256 |
| Troca de chaves | RSA, ECDH |
| Assinaturas digitais | RSA, ECDSA, Ed25519 |
| Armazenamento de senhas | bcrypt, Argon2 (hashing) |
| Comunicacao HTTPS | Hibrido (RSA + AES) |
Ferramentas Relacionadas
| Ferramenta | Proposito |
|---|---|
| Criptografia/Descriptografia | Criptografia AES |
| Gerador de Chaves RSA | Geracao de pares RSA |
| Gerador de Hash | Hashing SHA, MD5 |
Sobre o Autor
Toolypet Team
Development Team
The Toolypet Team creates free, privacy-focused web tools for developers and designers. All tools run entirely in your browser with no data sent to servers.