Gerador e Verificador de Hash Argon2id

Você digita uma senha de teste e recebe o hash Argon2id gerado pelo PHP, ou confere se uma senha corresponde a um hash existente, para quem implementa ou audita o login de aplicativo, portal de fornecedor ou programa de fidelidade.

Gerar Hash
Verificar Hash

O que é Argon2id?

Argon2id é o algoritmo vencedor da Password Hashing Competition (2015) e é hoje o padrão recomendado pelo OWASP para armazenamento seguro de senhas. Combina resistência a ataques de GPU (Argon2d) e resistência a ataques de side-channel (Argon2i), sendo a variante híbrida mais equilibrada para uso geral.

Onde e por que usar?

Use Argon2id sempre que precisar armazenar senhas de usuários em banco de dados. Diferente de MD5 ou SHA-256 (algoritmos rápidos, facilmente quebráveis por GPUs modernas), o Argon2id é intencionalmente lento e exige muita memória RAM, tornando ataques de força bruta proibitivamente caros. É suportado nativamente pelo PHP 7.3+ via password_hash() com PASSWORD_ARGON2ID.

Como funciona?

No bloco "Gerar Hash", insira a senha e clique em "Gerar Argon2id". O hash é criado no servidor PHP e retornado via API — nunca armazenado. No bloco "Verificar Hash", insira a senha em texto claro e o hash armazenado; o servidor verifica a correspondência usando password_verify() sem precisar conhecer a senha original.

Quando usar e quando não usar

O gerador é útil para criar o usuário de homologação de um sistema novo e para ver, com um hash real na frente, que parâmetros o PHP está usando. O verificador resolve outro problema recorrente: o login que falha em produção. Com a senha de teste e o hash copiado do banco, dá para separar em segundos um hash corrompido de um erro no código que compara.

Não use com senha real, porque senha e hash são enviados ao servidor do site. Não use para migrar uma base, que deve ser feito no próprio sistema, no momento do login. E não use hash para dado que precisa ser lido de volta, como CPF que o atendimento consulta: hash não se desfaz, e esse caso pede criptografia com chave, não hash de senha.

Exemplo: anatomia de um hash gerado aqui

Senha de teste exemplo-teste. Resultado devolvido pelo servidor:

$argon2id$v=19$m=65536,t=4,p=1$RUF6RmZkN2dYQkw5ZVVyUg$Z7SSLW/oPe5jR+elDloeBDpjCXh6/MQ+JXm9vnTkphs
  • argon2id: a variante híbrida, que combina a resistência a ataque por GPU do Argon2d com a proteção contra ataque de canal lateral do Argon2i.
  • v=19: versão 1.3 do algoritmo (0x13 em hexadecimal).
  • m=65536: 65.536 KiB, ou 64 MiB de memória por cálculo.
  • t=4: quatro passagens sobre essa memória.
  • p=1: uma linha de execução.
  • O trecho seguinte é o salt, 16 bytes aleatórios em Base64, e o último é o hash de 32 bytes.

No verificador, a mesma senha com esse hash devolve "O hash confere com a senha!". Um detalhe que costuma confundir: exemplo-teste com um espaço no fim também confere, porque a página remove espaços das pontas antes de enviar. Um backend que não faz o mesmo vai recusar essa senha.

Como a geração e a verificação funcionam

Ao clicar em Gerar, a senha segue por POST para /api/generate-argon2. O PHP chama password_hash com PASSWORD_ARGON2ID e os parâmetros padrão da instalação, que são os do exemplo, sorteia o salt e devolve a string completa. Como memória, passagens e salt ficam registrados dentro da própria string, o hash se descreve sozinho: quem verifica não precisa saber com que configuração ele foi gerado.

A verificação vai para /api/verify-argon2 e usa password_verify, que lê os parâmetros do hash, refaz o cálculo com a senha informada e compara os resultados de forma resistente a ataque de tempo. Nenhum dos dois endpoints grava senha ou hash. Se um dia a configuração do servidor mudar, password_needs_rehash indica no seu sistema quais hashes antigos devem ser refeitos no próximo login.

Limitações

  • Memória, passagens e paralelismo não são configuráveis. A página usa o padrão do PHP, acima do mínimo recomendado pelo OWASP (19 MiB, duas passagens e uma linha de execução).
  • Espaços no começo e no fim da senha são removidos antes do envio, tanto na geração quanto na verificação.
  • O verificador aceita qualquer hash que password_verify reconheça, inclusive Bcrypt ($2y$). Não confunda um "confere" com confirmação de que o hash é Argon2id.
  • O tempo de resposta depende do servidor do site, não do seu. Para calibrar os parâmetros de produção, meça no hardware que vai rodar o login.
  • Precisa de conexão com a internet.

Privacidade

Diferente da maior parte desta Toolbox, esta ferramenta depende do servidor: senha e hash viajam por HTTPS até o PHP e voltam com o resultado, sem armazenamento. Por isso a regra é usar apenas senhas criadas para teste.

Para continuar

Como Armazenar Senhas de Usuários com Responsabilidade cobre salt, custo e migração com exemplos em PHP, e Argon2id em Apps de Fidelidade discute a escolha em uma base de milhões de clientes. Para criar a senha de teste, use o Gerador de Senhas; para comparar com Bcrypt, MD5 e SHA-256, o Gerador de Hash.

Perguntas frequentes

O que significam m=65536, t=4 e p=1 no hash Argon2id?

São os parâmetros de custo gravados no próprio hash: m é a memória em KiB (65.536 KiB equivalem a 64 MiB), t é o número de passagens sobre essa memória e p é o número de linhas de execução. Quanto maiores, mais caro fica testar senhas em massa, e mais recursos o servidor gasta em cada login.

Argon2id ou Bcrypt: qual escolher?

Para sistema novo, Argon2id, que é a primeira recomendação do OWASP para armazenamento de senhas. Bcrypt continua aceitável em sistemas legados ou em ambientes sem suporte a Argon2. O PHP oferece Argon2id pela constante PASSWORD_ARGON2ID desde a versão 7.3.

Por que a mesma senha gera um hash diferente a cada vez?

Porque cada geração sorteia um salt novo de 16 bytes, que fica gravado dentro do hash. Os dois resultados são válidos para a mesma senha, e a verificação usa o salt de cada um. Isso impede que duas contas com a mesma senha tenham o mesmo hash no banco.

Posso verificar um hash Bcrypt nesta página?

Sim. O verificador usa a função password_verify do PHP, que reconhece todos os formatos gerados por password_hash, inclusive Bcrypt com prefixo $2y$. Por isso uma resposta positiva não prova que o hash seja Argon2id: confira o prefixo da string.

A senha digitada fica armazenada?

Não. Senha e hash são enviados por HTTPS, processados pelo PHP e descartados, e os endpoints não gravam nada. Ainda assim, como o dado sai do seu computador, use apenas senhas criadas para teste.

Como Usamos Isso na NuAto

Cenário: Escolha de Algoritmo de Hash para App de Fidelidade de Cooperativa com 2 Milhões de Membros

Uma cooperativa de consumo com faturamento anual na casa dos bilhões de reais nos contratou para especificar a arquitetura de segurança do seu novo aplicativo de fidelidade. O app teria 2 milhões de membros ativos, com acesso a pontos acumulados, histórico de compras e benefícios exclusivos. A diretoria de tecnologia estava dividida entre BCrypt (pela popularidade) e Argon2id (pelo padrão mais recente). A decisão não era trivial: com uma base desse tamanho, o algoritmo escolhido impactaria diretamente a escalabilidade dos servidores de autenticação e o nível de proteção contra ataques futuros com hardware especializado.

Usamos o Gerador Argon2id para testar diferentes configurações de parâmetros no ambiente de produção antes de tomar a decisão. O ponto central do argumento técnico foi a resistência a ataques de hardware: BCrypt é eficiente em CPUs mas pode ser paralelizado em GPUs e FPGAs com hardware relativamente acessível. Argon2id com configuração de memória alta (64 MB por hash) torna ataques em GPU dramaticamente mais caros porque cada tentativa exige a alocação de memória completa — inviabilizando o paralelismo massivo. Testamos os tempos de resposta com os parâmetros recomendados pelo OWASP: memory_cost=65536, time_cost=3, threads=4, garantindo tempo de hash abaixo de 500ms por operação nos servidores de produção.

A recomendação final foi Argon2id com os parâmetros validados aqui. O app foi lançado seis meses depois com zero incidentes de segurança no primeiro ano de operação. O relatório de penetration testing contratado pela cooperativa classificou a implementação de autenticação como "sem vulnerabilidades identificáveis" — o único módulo que recebeu essa classificação. A decisão de usar Argon2id em vez de BCrypt foi citada explicitamente pelo time de pentest como diferencial positivo.

Para qualquer sistema de fidelidade varejista com base acima de 500 mil usuários, a escolha do algoritmo de hash deve ser documentada e justificada tecnicamente — não apenas seguida por convenção. O custo computacional extra do Argon2id é desprezível comparado ao custo de um vazamento de dados em escala de milhões de usuários.