O salt mata tabelas pré-computadas, mas nada faz quanto à velocidade bruta. Um hash rápido como o pode ser calculado bilhões de vezes por segundo numa GPU, então uma senha fraca ainda cai por força bruta direcionada mesmo com sal.
A ideia
Substitua o hash rápido por uma função de derivação de chave com um fator de trabalho ajustável. Fazer uma única tentativa custar, digamos, 10 milissegundos em vez de 10 nanossegundos é uma desaceleração de cerca de um milhão de vezes para o atacante, adicionando um atraso imperceptível a um login legítimo.
As opções
bcrypt tem um fator de custo que define o número de iterações. É maduro e amplamente suportado, embora trunque entradas longas.
scrypt adiciona um parâmetro de dureza de memória, então um atacante com hardware dedicado ou GPUs ganha menos, porque memória é cara de paralelizar.
Argon2, especificamente o Argon2id, é a recomendação atual e vencedor da Password Hashing Competition. Permite ajustar tempo, memória e paralelismo de forma independente.
PBKDF2 é baseado em iterações e aceitável onde há exigência de conformidade , mas não é resistente a memória, então resiste menos a GPUs que os demais.
Ajuste
Escolha um custo-alvo de tempo real por hash no seu próprio hardware e defina os parâmetros para atingi-lo, elevando o fator de trabalho ao longo do tempo conforme o hardware acelera. A (o Projeto Aberto Mundial de Segurança de Aplicações, do inglês Open Worldwide Application Security Project) publica parâmetros iniciais atuais para cada algoritmo.
A combinação é o que importa: um salt único para derrotar a pré-computação, mais uma (função de derivação de chave, do inglês key derivation function) lenta e ajustada para tornar cada tentativa restante cara.
Parâmetros de custo são uma promessa sobre um hardware que muda
Um fator de trabalho escolhido em 2015 não é a mesma defesa em 2026 contra o mesmo dinheiro. Parâmetros de custo envelhecem e, diferente de um certificado, não expiram e nada avisa.
A falha é silenciosa por construção: hashes criados com um fator antigo continuam conferindo para sempre, então uma aplicação pode estar rodando um custo de dez anos atrás sem erro, sem aviso e sem sintoma visível.
Duas consequências práticas. Guarde os parâmetros junto do hash — os formatos padrão fazem isso — para que antigo e novo coexistam durante a migração. E refaça o hash no login bem-sucedido, quando você tem o texto claro por um instante, que é o único momento em que a atualização é possível sem pedir nada ao usuário.