O Erro Conceitual que Antecede a Escolha
Antes de comparar performance ou resistência a ataques, é preciso desfazer a confusão mais comum: SHA-256 não é um algoritmo de senha. SHA-256 é uma função de hash criptográfica de propósito geral, projetada para ser rápida. BCrypt e Argon2id são funções de derivação de senha, projetadas deliberadamente para serem lentas. A velocidade que torna o SHA-256 excelente para verificar a integridade de um arquivo é exatamente o que o torna perigoso para armazenar senhas.
Um atacante com uma GPU moderna calcula bilhões de hashes SHA-256 por segundo. Se suas senhas estão armazenadas como SHA-256, um vazamento do banco de dados é praticamente equivalente a vazar as senhas em texto puro — basta rodar um ataque de dicionário ou força bruta a uma velocidade absurda. BCrypt e Argon2id existem justamente para que cada tentativa custe tempo e recursos ao atacante.
Para Que Serve Cada Um
SHA-256 — integridade, não senhas
SHA-256 pertence à família SHA-2 e é a escolha certa para verificar se um arquivo foi corrompido ou adulterado, gerar fingerprints de conteúdo, assinar dados em conjunto com HMAC, e qualquer cenário onde você precisa de um resumo determinístico e rápido. O caso de uso é "este conteúdo é exatamente o mesmo de antes?". Nunca deve ser usado sozinho para guardar senhas de usuários.
BCrypt — o padrão consolidado
Criado em 1999, o BCrypt introduziu o conceito de cost factor: um parâmetro que controla quantas iterações o algoritmo executa. Aumentar o cost dobra o tempo de processamento, o que permite ajustar a lentidão conforme o hardware evolui. É amplamente suportado em todas as linguagens, maduro e bem auditado. Sua principal limitação é não exigir muita memória — o que deixa espaço para ataques com hardware paralelo — e ignorar caracteres além dos 72 primeiros bytes da senha.
Argon2id — a recomendação atual
Vencedor do Password Hashing Competition em 2015 e recomendação do OWASP desde 2019, o Argon2id combina resistência a ataques de GPU (pelo uso intensivo de memória) e resistência a ataques de side-channel. Tem três parâmetros: memória, iterações e paralelismo. A exigência de memória real por tentativa é o que o torna superior contra atacantes com farms de GPU, que têm muito poder de processamento mas memória relativamente limitada.
Comparativo Direto
Resumindo as diferenças que importam na hora de decidir:
- Propósito: SHA-256 para integridade; BCrypt e Argon2id para senhas.
- Velocidade: SHA-256 é intencionalmente rápido (ruim para senhas); BCrypt e Argon2id são intencionalmente lentos (bom para senhas).
- Resistência a GPU: SHA-256 é fraco; BCrypt é razoável; Argon2id é forte por uso de memória.
- Parâmetro de memória: ausente no SHA-256 e no BCrypt; presente e configurável no Argon2id.
- Suporte/maturidade: SHA-256 e BCrypt são universais; Argon2id requer PHP 7.2+ com libsodium ou 7.4+ nativo.
- Recomendação 2026: Argon2id para novos sistemas; BCrypt como alternativa sólida em ambientes que não suportam Argon2id.
A Decisão Prática para 2026
A árvore de decisão é mais simples do que parece. Se você está construindo um sistema novo e o ambiente suporta Argon2id, use Argon2id — não há razão técnica para escolher outra coisa. Se o ambiente é legado ou não tem suporte a Argon2id, use BCrypt com cost igual ou superior a 12, calibrado para levar pelo menos um segundo no seu servidor de produção. Se você está pensando em SHA-256 para senhas, pare: você está prestes a cometer o erro clássico. SHA-256 é para integridade de dados, e nessa função é excelente.
Há um caso intermediário legítimo: usar SHA-256 dentro de uma construção HMAC com chave secreta (como em PBKDF2) é seguro para senhas, porque a iteração e a chave compensam a velocidade. Mas, mesmo aí, Argon2id continua sendo a escolha mais robusta para implementações novas.
Migrando de um Algoritmo Fraco
Se você descobriu que suas senhas estão em SHA-256 ou MD5, a migração não exige saber as senhas dos usuários. O padrão é o rehash no login: quando o usuário autentica com sucesso usando o hash antigo, você imediatamente gera um novo hash com Argon2id (ou BCrypt) a partir da senha que ele acabou de digitar e substitui o registro. Em poucas semanas, a maior parte da base ativa já estará migrada, e você pode forçar reset para os usuários inativos restantes.
Use o Gerador de Hashes para experimentar BCrypt e SHA-256 e entender na prática a diferença de comportamento entre eles, e o Gerador Argon2id para gerar e verificar hashes Argon2id com parâmetros configuráveis. Comparar as saídas lado a lado deixa claro por que cada algoritmo serve a um propósito distinto.
Camadas que Complementam a Escolha do Algoritmo
Escolher o algoritmo certo é necessário, mas não é o fim da história. Duas técnicas adicionais elevam a proteção sem substituir o hash. A primeira é o pepper: um segredo global, armazenado fora do banco de dados (em uma variável de ambiente ou cofre de segredos), que é combinado com a senha antes do hash. Diferente do salt, que fica junto do hash, o pepper não vaza junto com o banco — então, mesmo que o atacante obtenha todos os hashes e salts, ele ainda não tem o pepper, o que inviabiliza a quebra offline. A segunda é o rate limiting no endpoint de login: limitar o número de tentativas por conta e por IP em uma janela de tempo derruba ataques de força bruta online, que tentam senhas diretamente contra a sua aplicação em vez de contra um banco vazado.
Essas camadas atacam vetores diferentes. O algoritmo lento protege contra ataques offline após um vazamento; o pepper adiciona um segredo que o vazamento não revela; o rate limiting protege contra ataques online em tempo real. Um sistema responsável usa os três, porque depender de uma única defesa significa que sua falha derruba toda a proteção. A escolha entre BCrypt, Argon2id e SHA-256 é a fundação — mas é só a fundação.
Perguntas Frequentes
Posso usar SHA-256 para guardar senhas se adicionar um salt?
O salt impede ataques de rainbow table, mas não resolve o problema fundamental: SHA-256 é rápido demais. Com salt, o atacante ainda calcula bilhões de tentativas por segundo por senha em hardware moderno. Salt é necessário, mas não suficiente. Para senhas, use um algoritmo deliberadamente lento e com salt embutido, como BCrypt ou Argon2id. SHA-256 só é aceitável para senhas dentro de uma construção iterada com chave, como PBKDF2-HMAC-SHA256.
Argon2id é sempre melhor que BCrypt?
Tecnicamente Argon2id oferece proteção superior por exigir memória, o que dificulta ataques com GPU. Mas BCrypt bem configurado (cost 12 ou mais) continua sendo uma proteção sólida e suficiente para a maioria dos sistemas. A vantagem prática do BCrypt é o suporte universal e a maturidade. Para sistemas novos com suporte adequado, prefira Argon2id; para ambientes legados ou onde a simplicidade de implementação importa, BCrypt atualizado é uma escolha perfeitamente defensável.
Como sei se o cost ou os parâmetros estão adequados?
A regra prática do OWASP é que a operação de hash leve pelo menos um segundo no servidor de produção sob carga normal. Meça no ambiente real, não no laptop de desenvolvimento, que costuma ser mais rápido. Se a operação está abaixo de um segundo, aumente o cost (no BCrypt) ou a memória/iterações (no Argon2id). Reavalie os parâmetros a cada 12 a 18 meses, conforme o hardware do servidor é atualizado e fica mais rápido.