Armazenamento seguro de senhas
Faça hash das senhas com password_hash e verifique-as com password_verify.
Armazenamento seguro de senhas é uma aula grátis de PHP Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de PHP Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de PHP Academy inclui 4 aulas no total.
Nunca armazene senhas em texto simples
Armazenar senhas em texto simples significa que uma violação do banco de dados expõe a senha de cada usuário. Sempre armazene um resumo criptográfico, idealmente bcrypt, Argon2id ou scrypt.
password_hash()
A função password_hash() integrada do PHP cria um resumo criptográfico seguro com um sal aleatório incluído na saída.
<?php
$hash = password_hash("mysecretpassword", PASSWORD_BCRYPT);
// Output: $2y$10$... (includes algorithm, cost, salt, hash)password_verify()
Verifique uma senha em texto simples em relação a um resumo criptográfico armazenado.
<?php
$hash = "$2y$10$abcdef...";
$valid = password_verify("mysecretpassword", $hash);
if ($valid) {
echo "Correct password!";
}Opções de algoritmo
O PHP é compatível com:
PASSWORD_BCRYPT— amplamente compatível, limite de 72 bytesPASSWORD_ARGON2I— exige muita memória (PHP 7.2+)PASSWORD_ARGON2ID— recomendado, resiste a ataques de GPU (PHP 7.3+)PASSWORD_DEFAULT— atualmente bcrypt, mas pode mudar em versões futuras do PHP
Fator de custo
O fator de custo controla a lentidão do cálculo do resumo. Custo maior = ataques de força bruta mais lentos. O custo padrão do bcrypt é 10.
<?php
$hash = password_hash("secret", PASSWORD_BCRYPT, ["cost" => 12]);
// Cost 12 takes ~0.5s on typical hardware — acceptable for loginpassword_needs_rehash()
Após atualizar o PHP ou alterar as configurações de custo, verifique se os resumos existentes precisam ser atualizados.
<?php
if (password_verify($plain, $storedHash) &&
password_needs_rehash($storedHash, PASSWORD_DEFAULT)) {
$user->update(["password" => password_hash($plain, PASSWORD_DEFAULT)]);
}Fachada Hash do Laravel
O Laravel encapsula password_hash na fachada Hash, usando bcrypt por padrão.
<?php
use Illuminate\Support\Facades\Hash;
$hash = Hash::make("mysecretpassword");
$valid = Hash::check("mysecretpassword", $hash); // trueArgon2 no Laravel
Configure o Laravel para usar Argon2id em config/hashing.php.
// config/hashing.php
"driver" => "argon2id",Gerenciamento de sais
As funções modernas de geração de resumos do PHP incluem automaticamente um sal criptograficamente aleatório. Nunca implemente seu próprio sal — é fácil fazê-lo de forma incorreta.
Pimenta (segredo no nível da aplicação)
Um segredo adicional opcional (pimenta), armazenado fora do banco de dados, pode ser misturado antes da geração do resumo. Mesmo que o banco de dados seja roubado, o invasor não conseguirá realizar um ataque de força bruta sem a pimenta.
Comparação em tempo constante
password_verify() usa internamente uma comparação em tempo constante, impedindo ataques de temporização. Nunca compare resumos usando ==.
Resumo
Use password_hash() com PASSWORD_DEFAULT ou PASSWORD_ARGON2ID. Verifique com password_verify(). Gere um novo resumo ao fazer login, se necessário. Nunca armazene texto simples nem use MD5/SHA1 para senhas.
Verificação rápida
Qual função verifica uma senha em relação a um resumo gerado pelo PHP?
Perguntas Frequentes
A aula “Armazenamento seguro de senhas” é grátis?
Sim — o texto completo de “Armazenamento seguro de senhas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de PHP Academy, atualize para CoddyKit PRO. O curso de PHP Academy inclui 4 aulas no total.
O que vou aprender em “Armazenamento seguro de senhas”?
Faça hash das senhas com password_hash e verifique-as com password_verify. Você pratica PHP Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar PHP Academy?
Nenhuma experiência prévia é necessária. PHP Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Armazenamento seguro de senhas”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de PHP Academy?
Sim. Cada aula de PHP Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Prevenção de Cross-Site Scripting (XSS)
- Injeção de SQL e consultas parametrizadas
- Proteção contra CSRF
- Armazenamento seguro de senhas