Hash e salt para senhas em PHP: melhores práticas 2025

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Hash, salt e sua segurança: por que isso é importante em 2025?

\n\n

Imagine: você criou um site incrível, tudo funciona, os usuários se registram. Mas um dia, o banco de dados vaza para a internet. O que os invasores verão? Se você armazena senhas em texto puro — é uma catástrofe. Se você usa o antigo md5 — é quase a mesma coisa. Mas se você aplicou hash e salt seguro — os invasores verão apenas uma sequência sem sentido de caracteres. Em 2025, isso não é apenas uma recomendação, é um padrão de segurança.

\n\n

Neste artigo, vamos explorar como fazer hash de senhas em PHP corretamente, usando algoritmos modernos, salt e melhores práticas. Você descobrirá por que os métodos antigos são perigosos e como migrar para o armazenamento seguro de senhas em apenas 10 minutos.

\n\n

Por que md5 e sha1 são prejudiciais?

\n\n

Muitos desenvolvedores iniciantes cometem o mesmo erro: usar md5($password) ou sha1($password). Em 2025, isso não é apenas uma má prática, é um caminho direto para a vulnerabilidade. Por quê?

\n\n
    \n
  • Velocidade de processamento. MD5 e SHA1 foram criados para velocidade, não para segurança. GPUs modernas podem processar bilhões de hashes por segundo.
  • \n
  • Falta de salt. Se dois usuários escolherem a mesma senha, seus hashes serão idênticos. Isso permite o uso de tabelas rainbow.
  • \n
  • Colisões. Para MD5, foram encontradas colisões práticas — duas entradas diferentes geram o mesmo hash.
  • \n
\n\n

Felizmente, o PHP possui funções nativas que resolvem todos esses problemas. E isso não requer a instalação de bibliotecas externas.

\n\n

password_hash e password_verify: sua arma secreta

\n\n

A partir do PHP 5.5.0, a linguagem ganhou duas funções mágicas: password_hash() e password_verify(). Elas geram salt automaticamente, usam algoritmos criptograficamente seguros e protegem contra ataques de temporização.

\n\n

Exemplo de uso básico:

\n\n
// Fazendo hash da senha\n$password = "MinhaSenhaSuperSegura@2025!";\n$hash = password_hash($password, PASSWORD_DEFAULT);\necho $hash; // $2y$10$...\n
\n\n

O que aconteceu aqui? A função password_hash:

\n
    \n
  • Gerou um salt aleatório
  • \n
  • Selecionou o algoritmo ideal (por padrão, bcrypt)
  • \n
  • Calculou o hash
  • \n
  • Retornou uma string que contém o hash, o salt e as informações do algoritmo
  • \n
\n\n

A verificação da senha é igualmente simples:

\n\n
// Verificando a senha\n$senhaDigitada = "MinhaSenhaSuperSegura@2025!";\nif (password_verify($senhaDigitada, $hash)) {\n    echo "Senha correta!";\n} else {\n    echo "Senha incorreta.";\n}\n
\n\n

Observe: você não precisa armazenar o salt separadamente. Ele já está embutido no hash. Isso é o hash e salt seguro em ação.

\n\n

Qual algoritmo escolher em 2025?

\n\n

Por padrão, o password_hash usa bcrypt. É uma excelente escolha para a maioria dos projetos. Mas temos outras opções:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
AlgoritmoConstanteRecomendação
BcryptPASSWORD_BCRYPTExcelente escolha, suportado em todos os lugares
Argon2iPASSWORD_ARGON2IResistente a ataques de canal lateral
Argon2idPASSWORD_ARGON2IDMelhor escolha em 2025
\n\n

Argon2id é o vencedor da competição PHC (Password Hashing Competition). Ele é resistente tanto a ataques de GPU quanto a ataques de temporização. Se o seu PHP foi compilado com suporte a Argon2 (e no PHP 8.x isso já é padrão), use-o.

\n\n

Configurando o custo do hash

\n\n

Uma das ideias-chave do hash e salt seguro é tornar o processamento lento o suficiente para dificultar ataques de força bruta, mas rápido o bastante para não prejudicar a experiência do usuário. Você pode ajustar isso com o parâmetro 'cost' (para bcrypt) ou 'memory_cost' e 'time_cost' (para Argon2).

\n\n
// Ajustando o custo para bcrypt\n$options = [\n    'cost' => 12, // Quanto maior, mais lento e seguro\n];\n$hash = password_hash($password, PASSWORD_BCRYPT, $options);\n\n// Ajustando para Argon2id\n$options = [\n    'memory_cost' => 1<<17, // 128 MB\n    'time_cost'   => 4,     // 4 iterações\n    'threads'     => 2,     // 2 threads\n];\n$hash = password_hash($password, PASSWORD_ARGON2ID, $options);\n
\n\n

Dica profissional: teste o custo no seu servidor. Ajuste para que o hash leve entre 0,1 e 0,5 segundos. Isso é suficiente para dificultar ataques sem sobrecarregar o sistema.

\n\n

Erros comuns ao usar hash e salt em PHP

\n\n

Mesmo com funções nativas, alguns desenvolvedores cometem erros. Evite estes:

\n\n
    \n
  • Usar PASSWORD_DEFAULT e depois mudar o PHP: O algoritmo padrão pode mudar em versões futuras. Sempre verifique se o hash precisa ser atualizado com password_needs_rehash().
  • \n
  • Limitar o tamanho da senha: Não defina um limite máximo de caracteres para senhas. Hashes modernos aceitam senhas longas com segurança.
  • \n
  • Armazenar o hash em um campo muito curto: O hash do bcrypt pode ter até 60 caracteres, e do Argon2, até 255. Use VARCHAR(255) para garantir.
  • \n
  • Ignorar a rehash: Quando você aumentar o custo ou mudar o algoritmo, os hashes antigos precisam ser atualizados no próximo login do usuário.
  • \n
\n\n

Exemplo completo: registro e login seguros

\n\n

Vamos juntar tudo em um exemplo prático de cadastro e login:

\n\n
// CADASTRO\n$senha = $_POST['senha'];\n$hash = password_hash($senha, PASSWORD_ARGON2ID);\n// Salve $hash no banco de dados\n\n// LOGIN\n$senhaDigitada = $_POST['senha'];\n$hashDoBanco = // recupere o hash do banco\n\nif (password_verify($senhaDigitada, $hashDoBanco)) {\n    // Verifica se o hash precisa ser atualizado\n    if (password_needs_rehash($hashDoBanco, PASSWORD_ARGON2ID)) {\n        $novoHash = password_hash($senhaDigitada, PASSWORD_ARGON2ID);\n        // Atualize o hash no banco de dados\n    }\n    echo "Login bem-sucedido!";\n} else {\n    echo "Senha incorreta.";\n}\n
\n\n

Esse padrão garante que suas senhas estejam sempre protegidas com o algoritmo mais seguro disponível, mesmo quando você atualizar seu sistema.

\n\n

Conclusão: sua responsabilidade em 2025

\n\n

Em 2025, não há desculpas para armazenar senhas de forma insegura. O PHP oferece ferramentas completas e fáceis de usar para implementar hash e salt seguro. Basta usar password_hash e password_verify, escolher Argon2id quando possível, e ajustar o custo conforme necessário.

\n\n

Lembre-se: a segurança dos seus usuários começa com você. Implemente essas práticas hoje mesmo e durma tranquilo sabendo que as senhas estão protegidas.

\n\n

Gostou do guia? Compartilhe com outros desenvolvedores e ajude a tornar a web um lugar mais seguro!

Blogs

Book Recommendations