Criptografia simétrica vs assimétrica: a diferença que confunde todo mundo
Simétrica usa uma chave, assimétrica usa um par public/private, e hashing não é criptografia. Entenda quando usar cada uma e por que o TLS usa as duas.
Toda semana alguém aparece no canal de engenharia dizendo que vai "criptografar a senha no banco com uma chave secreta". E quase sempre o que a pessoa quer não é criptografia nenhuma. A confusão clássica é tratar tudo como "uma chave" só: TLS, senha de usuário, token de sessão, tudo no mesmo balaio. Mas existem dois modelos de criptografia que funcionam de formas opostas, e há um terceiro conceito que nem chave usa — e que é justamente onde a maioria escorrega.
Este artigo separa os três: criptografia simétrica, criptografia assimétrica e hashing. Quando usar cada um, por que o mundo real usa os dois primeiros juntos, e por que o terceiro não é criptografia coisa nenhuma.
A diferença em uma frase
Criptografia simétrica usa uma única chave para cifrar e decifrar. A mesma chave que tranca, destranca. Criptografia assimétrica usa um par de chaves: uma public key e uma private key, matematicamente ligadas, em que o que uma faz só a outra desfaz.
Parece detalhe, mas muda tudo sobre quem pode ler o quê e, principalmente, sobre como você entrega a chave para a outra ponta.
Simétrica: rápida, e o problema é a chave
Na criptografia simétrica você tem uma chave (uma sequência de bytes, tipicamente 256 bits no AES) e a usa nas duas pontas. O emissor cifra com a chave, o receptor decifra com a mesma chave. O algoritmo padrão hoje é o AES, de preferência no modo AES-GCM, que além de cifrar também autentica (detecta se o ciphertext foi adulterado).
A grande vantagem é velocidade. AES é absurdamente rápido, geralmente acelerado por hardware (instruções AES-NI na CPU). Para cifrar um arquivo de 5 GB, um backup, um volume de disco ou um stream de vídeo, simétrica é a única opção sensata.
# cifrar um arquivo com AES-256 (simétrico)
openssl enc -aes-256-gcm -in dados.txt -out dados.enc -pbkdf2
# decifrar usa exatamente a mesma senha/chave
openssl enc -d -aes-256-gcm -in dados.enc -out dados.txt -pbkdf2
O problema não é cifrar. O problema é a key distribution: como você entrega aquela chave para quem precisa decifrar, sem que um terceiro intercepte no caminho? Se você manda a chave por e-mail junto com o arquivo, parabéns, você não protegeu nada. Esse é o calcanhar de Aquiles da simétrica — e é exatamente o problema que a assimétrica resolve.
Assimétrica: lenta, mas resolve a distribuição de chave
Na criptografia assimétrica você gera um par: public key e private key. A public key você pode espalhar para o mundo inteiro, colar no GitHub, mandar por e-mail. A private key você guarda como ouro e nunca compartilha. A matemática garante duas propriedades úteis:
- O que é cifrado com a public key só é decifrado com a private key correspondente. Qualquer um pode te mandar algo cifrado; só você lê.
- O que é assinado com a private key pode ser verificado por qualquer um com a public key. Essa é a base da assinatura digital: prova que a mensagem veio de você e não foi alterada.
Os algoritmos clássicos são o RSA e, cada vez mais, criptografia de curva elíptica (ECC), que entrega a mesma segurança com chaves bem menores e mais rápida.
O preço é a lentidão. Operações assimétricas são ordens de magnitude mais caras que AES. Ninguém cifra um arquivo de 5 GB com RSA, seria absurdo. Então para que serve? Para resolver justamente o key distribution da simétrica.
Cifrar não é a mesma coisa que assinar
Vale martelar esse ponto porque confunde: cifrar para sigilo e assinar para autenticidade são usos diferentes do mesmo par de chaves. Para sigilo, você cifra com a public key do destinatário (só ele lê). Para autenticidade, você assina com a sua private key (todos verificam que foi você). São objetivos opostos e não se substituem.
O mundo real usa os dois: criptografia híbrida
Aqui está o ponto que derruba a ideia de que TLS é "só uma chave". O TLS, que protege todo HTTPS, é um sistema híbrido. Ele usa os dois modelos, cada um no que faz melhor:
- Handshake (assimétrico): o cliente e o servidor usam criptografia assimétrica para fazer o key exchange e combinar, de forma segura, uma chave de sessão simétrica. Ninguém no meio do caminho consegue capturar essa chave.
- Sessão (simétrico): a partir daí, todo o tráfego real — os bytes da página, as requests, o vídeo — é cifrado com AES usando aquela chave de sessão. Rápido.
Ou seja: a assimétrica resolve o problema difícil (entregar a chave com segurança) e a simétrica faz o trabalho pesado (cifrar volume). Cada uma cobre a fraqueza da outra. Praticamente todo protocolo sério de criptografia, do TLS ao SSH ao PGP, segue esse padrão híbrido.
| Simétrica | Assimétrica | |
|---|---|---|
| Chaves | Uma compartilhada | Par (public/private) |
| Velocidade | Muito rápida | Lenta |
| Boa para | Volume de dados | Key exchange, assinatura |
| Problema | Distribuir a chave | Custo computacional |
| Exemplos | AES, ChaCha20 | RSA, ECC |
O terceiro conceito: hashing não é criptografia
Agora o ponto que mais confunde, e a raiz daquele pedido de "criptografar a senha". Hashing não é criptografia. Criptografia é reversível por definição: existe uma chave que desfaz. Hashing é mão única e não usa chave nenhuma. Você joga os dados numa função de hash e recebe um valor de tamanho fixo; não existe operação que devolva o dado original a partir do hash.
É por isso que hash é o jeito certo de guardar senha. Você nunca quer poder "decifrar" a senha do usuário, porque, se você consegue, um atacante que roubar a sua chave também consegue. Você guarda o hash, e na hora do login faz o hash do que o usuário digitou e compara. Para senhas, use funções desenhadas para isso, como bcrypt ou Argon2, que são deliberadamente lentas para resistir a ataques de força bruta — nunca um hash rápido cru como SHA-256 sozinho.
Se você quiser ver na prática a diferença entre uma transformação de mão única e cifragem, dá para brincar com um gerador de hash: mude um caractere da entrada e veja a saída inteira mudar, sem nenhuma chave envolvida e sem volta.
Quando usar cada um
A regra prática:
- Cifrar volume de dados (arquivos, backups, payloads grandes): simétrica, AES-GCM.
- Trocar uma chave com segurança por um canal aberto ou provar identidade: assimétrica, ECC ou RSA, ou um protocolo híbrido pronto como TLS.
- Guardar senha ou verificar integridade: hashing. Senha = bcrypt/Argon2. Integridade/checksum = SHA-256.
E a opinião que você já deve estar esperando: não invente sua própria criptografia. Crypto é uma das áreas em que código "que funciona nos testes" pode estar completamente quebrado contra um atacante. Use bibliotecas auditadas (libsodium, a stdlib de crypto da sua linguagem, o TLS do sistema), prefira AES-GCM e ECC modernos como default, e deixe modo de operação, nonce e padding para quem já resolveu isso direito. Se você está gerando seu próprio nonce na mão, já parou para olhar o que está fazendo?
Para o pano de fundo de por que tudo isso importa — confidencialidade, integridade, autenticidade — vale ler os conceitos básicos de segurança da informação, que enquadram onde cada uma dessas técnicas se encaixa.
Perguntas frequentes
Criptografia simétrica ou assimétrica é melhor?
Nenhuma é "melhor"; elas resolvem problemas diferentes. A simétrica é rápida e ideal para cifrar grandes volumes de dados, mas você precisa distribuir a chave com segurança. A assimétrica é lenta, porém permite trocar chaves por um canal aberto e assinar dados. Por isso os sistemas reais combinam as duas.
Por que o TLS usa os dois tipos de criptografia?
Porque cada uma cobre a fraqueza da outra. A criptografia assimétrica cuida do handshake e do key exchange com segurança, e em seguida uma chave simétrica rápida cifra o tráfego real da sessão. Usar assimétrica para tudo seria lento demais; usar só simétrica deixaria você sem um jeito seguro de compartilhar a chave.
Hashing é um tipo de criptografia?
Não. Criptografia é reversível com uma chave; hashing é uma função de mão única, sem chave, então não há como recuperar a entrada original a partir do hash. É exatamente por isso que hashing (com bcrypt ou Argon2) é o jeito certo de guardar senha, e não criptografia.
Quais algoritmos devo usar hoje?
Para simétrica, AES-GCM (ou ChaCha20-Poly1305). Para assimétrica, criptografia de curva elíptica (ECC) moderna ou RSA com tamanhos de chave adequados. Para armazenar senha, bcrypt ou Argon2. E use uma biblioteca auditada em vez de implementar qualquer um desses por conta própria.
Resumo prático
Simétrica é uma chave só, rápida, ótima para volume, e o problema é distribuir a chave. Assimétrica é um par public/private, lenta, e resolve a distribuição de chave e a assinatura digital. O mundo real usa as duas juntas (TLS faz o handshake assimétrico e a sessão simétrica). E hashing não é criptografia: é mão única, sem chave, e é o jeito certo de guardar senha. Decore essa separação e você já para de cometer o erro mais comum em segurança. E, de novo: não escreva sua própria crypto.
- 01 O que é software open source Open source não significa gratuito. Entenda o que a licença realmente define, as diferenças entre MIT, GPL e Apache, e como projetos open source se sustentam financeiramente.
- 02 PostgreSQL vs MySQL: diferenças práticas para quem precisa escolher Comparativo honesto entre PostgreSQL e MySQL: tipos nativos, JSONB vs JSON_EXTRACT, concorrência MVCC e extensões. Por que PostgreSQL como default faz sentido.