Hash, salt e sua segurança: por que isso é importante em 2025?
\n\nImagine: 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\nNeste 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\nPor que md5 e sha1 são prejudiciais?
\n\nMuitos 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
- 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
Felizmente, o PHP possui funções nativas que resolvem todos esses problemas. E isso não requer a instalação de bibliotecas externas.
\n\npassword_hash e password_verify: sua arma secreta
\n\nA 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.
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\nO que aconteceu aqui? A função password_hash:
- \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
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\nObserve: você não precisa armazenar o salt separadamente. Ele já está embutido no hash. Isso é o hash e salt seguro em ação.
\n\nQual algoritmo escolher em 2025?
\n\nPor padrão, o password_hash usa bcrypt. É uma excelente escolha para a maioria dos projetos. Mas temos outras opções:
| Algoritmo | \nConstante | \nRecomendação | \n
|---|---|---|
| Bcrypt | \nPASSWORD_BCRYPT | \n Excelente escolha, suportado em todos os lugares | \n
| Argon2i | \nPASSWORD_ARGON2I | \n Resistente a ataques de canal lateral | \n
| Argon2id | \nPASSWORD_ARGON2ID | \n Melhor escolha em 2025 | \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\nConfigurando o custo do hash
\n\nUma 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\nDica 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\nErros comuns ao usar hash e salt em PHP
\n\nMesmo 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
Exemplo completo: registro e login seguros
\n\nVamos 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\nEsse padrão garante que suas senhas estejam sempre protegidas com o algoritmo mais seguro disponível, mesmo quando você atualizar seu sistema.
\n\nConclusão: sua responsabilidade em 2025
\n\nEm 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.
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\nGostou do guia? Compartilhe com outros desenvolvedores e ajude a tornar a web um lugar mais seguro!