A Decisão Arquitetural que Importa no Lançamento
Quando um app de fidelidade de grande cooperativa de consumo estava em desenvolvimento, a escolha do algoritmo de hash de senha chegou como uma pergunta técnica na reunião de arquitetura: BCrypt (já usado em outros sistemas da cooperativa) ou Argon2id (recomendação mais recente do OWASP)? A resposta dependia de entender o modelo de ameaça específico de um app com 2 milhões de membros e dados de cashback acumulado.
A questão central não era qual algoritmo era "mais difícil de quebrar" em teoria — era qual algoritmo manteria senhas protegidas por mais tempo se o banco de dados fosse comprometido e os hashes vazassem. Para isso, a análise tinha que considerar o hardware que um atacante real usaria: não CPU comum, mas GPUs de alto desempenho ou ASICs especializados em computação de hash.
BCrypt é resistente a CPU mas tem limitações em paralelismo de memória — um atacante com farm de GPUs consegue escalar ataques com custo linear. Argon2id tem parâmetro de uso de memória: o algoritmo aloca e usa ativamente um bloco de memória durante o cálculo, o que faz com que cada tentativa de hash consuma memória real — algo que GPUs têm em quantidade limitada comparado à sua capacidade de processamento paralelo. A escolha foi Argon2id.
Diferença entre BCrypt, scrypt e Argon2id
Os três algoritmos foram projetados para armazenamento de senhas, mas com ênfases diferentes:
BCrypt (1999)
Work factor baseado em iterações de CPU. O cost factor dobra o tempo de processamento a cada unidade. Sem parâmetro de memória — um atacante com hardware paralelo consegue escalar ataques de forma eficiente porque cada instância de BCrypt usa apenas CPU, sem pressão de memória. Amplamente suportado em todas as linguagens e frameworks. Limite de senha de 72 bytes (caracteres além do 72º são ignorados).
scrypt (2009)
Introduziu o parâmetro de memória (N), tornando ataques com hardware paralelo mais caros — você precisa de memória real para cada thread de ataque. Mais complexo de configurar corretamente do que BCrypt. Menos suportado em linguagens e frameworks do que BCrypt e Argon2id. Ainda uma boa escolha, mas foi essencialmente superado pelo Argon2id em termos de recomendação atual.
Argon2id (2015, vencedor do Password Hashing Competition)
Combina dois modos do Argon2: o modo "d" (resistente a ataques de GPU por uso intensivo de memória) e o modo "i" (resistente a ataques de side-channel). O modo "id" oferece proteção em ambas as frentes. Três parâmetros configuráveis: memória (m), iterações (t), e paralelismo (p). É a recomendação do OWASP desde 2019 para novas aplicações.
Configuração de Parâmetros Argon2id para Varejo
A configuração recomendada pelo OWASP como ponto de partida: m=65536 (64MB de memória), t=3 (3 iterações), p=4 (4 threads paralelas). Essa configuração leva aproximadamente 300-500ms em hardware de servidor moderno — similar ao BCrypt cost=12, com proteção adicional contra ataques de GPU.
Para o app de fidelidade com 2 milhões de membros, os parâmetros foram ajustados considerando o hardware do servidor de autenticação:
- m=131072 (128MB): dobro do mínimo recomendado pelo OWASP. Em um servidor com 8GB de RAM, isso limita a 64 instâncias simultâneas de verificação de senha — mais do que suficiente para o pico de logins.
- t=3: número de iterações. Aumentar t linearmente aumenta o tempo sem aumentar o uso de memória. Para maior proteção com mesmo uso de RAM, prefira aumentar t antes de aumentar m.
- p=2: paralelismo reduzido para 2 em vez de 4, porque o servidor de autenticação era compartilhado com outros serviços. Isso limitava o custo de CPU por operação de login.
Use o Gerador Argon2id para gerar hashes com os parâmetros configurados e verificar senhas existentes. A ferramenta exibe o hash completo no formato Argon2id com todos os parâmetros embutidos na string de resultado.
Por Que Argon2id é Recomendado pelo OWASP desde 2019
O Password Hashing Competition, concluído em 2015, avaliou algoritmos de hash de senha ao longo de 4 anos com participação de pesquisadores de criptografia do mundo todo. O Argon2 foi escolhido como vencedor em três categorias distintas: resistência a hardware customizado (GPU/FPGA/ASIC), resistência a side-channel timing attacks, e configurabilidade para diferentes perfis de hardware.
O OWASP incorporou a recomendação do Argon2id em seu Authentication Cheat Sheet em 2019 e a mantém como primeira recomendação em 2025. BCrypt permanece como alternativa aceitável — especialmente em sistemas legados onde a troca teria custo alto — mas novos sistemas não têm razão técnica para escolher BCrypt em vez de Argon2id.
A ressalva prática: Argon2id requer PHP 7.2+ com a extensão libsodium habilitada, ou PHP 7.4+ para o suporte nativo via password_hash($senha, PASSWORD_ARGON2ID). Em ambientes com PHP 5.x ou sem a extensão, BCrypt com cost adequado é a alternativa segura.
Impacto em Autenticação de 2 Milhões de Usuários
O pico de autenticação do app de fidelidade ocorria toda sexta-feira à noite — dia de acúmulo de pontos de compras da semana e consulta de saldo para o final de semana. O pico era de aproximadamente 8.000 logins por hora, ou 133 logins por minuto.
Com Argon2id a 400ms por verificação, 133 logins por minuto requer 133 × 0,4s / 60s = 0,89 instâncias de verificação simultâneas em média. Com p=2 (2 threads por verificação), o servidor de autenticação usava ~2 threads em média no pico — completamente dentro da capacidade de um servidor modesto.
O que realmente impacta a performance não é o algoritmo de hash — é a ausência de cache de sessão. Com tokens de sessão de 24 horas e refresh token de 30 dias, a maioria das requisições de usuários ativos nunca chega à camada de Argon2id. O custo computacional fica concentrado em logins reais, não em validações de sessão.
Perguntas Frequentes
Preciso migrar do BCrypt para Argon2id se meu sistema já está em produção?
Não necessariamente. BCrypt bem configurado (cost >= 12, ajustado para levar pelo menos 1 segundo no servidor) continua sendo uma proteção sólida. A migração para Argon2id faz mais sentido em novos sistemas ou em redesign completo de autenticação. Se a principal ameaça do seu sistema é ataque de GPU massivo (cenário de vazamento de banco de dados de grande escala), a migração gradual via verify-then-rehash vale o investimento. Para a maioria dos sistemas de varejo mid-market, BCrypt atualizado é suficiente.
Qual o limite de tamanho de senha com Argon2id?
Argon2id não tem limite de tamanho de senha — diferente do BCrypt que ignora caracteres após o 72º byte. Senhas longas funcionam completamente e contribuem para a segurança. Em aplicações de varejo com público amplo (apps de fidelidade, e-commerce), vale comunicar ao usuário que senhas longas são suportadas e encorajadas, mas limitar o máximo em 128 ou 256 caracteres para evitar ataques de DoS por senhas de megabytes.
Como verificar se os parâmetros Argon2id estão adequados para meu hardware?
Meça o tempo real de execução no servidor de produção (não no laptop de desenvolvimento). O OWASP recomenda que a operação leve pelo menos 1 segundo — se estiver abaixo disso, aumente m ou t. Se estiver acima de 2 segundos em condições de carga normal, reduza os parâmetros ou escale o servidor de autenticação. Reavalie a cada 18 meses conforme o hardware do servidor é atualizado.
Argon2id funciona com PHP nativo ou precisa de extensão?
PHP 7.4 e superior suportam Argon2id nativamente via password_hash($senha, PASSWORD_ARGON2ID, ['memory_cost' => 65536, 'time_cost' => 3, 'threads' => 4]). Para PHP 7.2-7.3, a extensão libsodium é necessária. Versões anteriores não suportam Argon2id nativamente. Confirme a presença da constante PASSWORD_ARGON2ID antes de usar — se não existir, a função lançará um erro silencioso e usará o algoritmo padrão.