Bcrypt em PHP: como fazer hash de senhas rápido e sem erros

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

Bcrypt em PHP: como fazer hash de senhas de forma correta e rápida

\n\n

Se você já se perguntou "How do you use bcrypt for hashing passwords in PHP?", saiba que não está sozinho. Essa pergunta no Stack Overflow acumula milhares de visualizações — e por um bom motivo. Fazer hash de senhas é a base da segurança de qualquer aplicação web, e o bcrypt continua sendo um dos algoritmos mais confiáveis e populares. Neste artigo, vamos entender como usar bcrypt em PHP, como configurá-lo para máxima performance e evitar armadilhas.

\n\n

Por que bcrypt? Porque ele é resistente a ataques de força bruta (brute-force) graças ao "salt" embutido e à complexidade ajustável. Mas como fazer para que seu site não fique lento a cada login? É disso que vamos tratar.

\n\n

O que é bcrypt e por que ele é melhor que MD5 ou SHA1?

\n\n

Vamos deixar claro desde já: nunca use MD5 ou SHA1 para fazer hash de senhas. Esses algoritmos foram criados para serem rápidos, e não para segurança. O bcrypt, por outro lado, foi projetado propositalmente para ser lento. Ele utiliza o cost factor (fator de custo), que determina quantas iterações de hash serão executadas. Quanto maior o cost factor, mais tempo leva para calcular o hash — e mais difícil fica para um invasor descobrir a senha.

\n\n

No PHP, o trabalho com bcrypt é extremamente simplificado graças às funções password_hash() e password_verify(). Elas foram introduzidas no PHP 5.5 e desde então se tornaram o padrão de facto.

\n\n

Como usar bcrypt em PHP: exemplo básico

\n\n

Vamos começar com o simples. Veja como registrar um usuário e salvar a senha dele:

\n\n
<?php\n// Registro de usuário\n$password = "MinhaSuperS@nha123";\n$hash = password_hash($password, PASSWORD_BCRYPT);\n\n// Salve $hash no banco de dados (ex: no campo password_hash)\necho $hash; // Exibirá algo como $2y$10$...\n?>
\n\n

E agora, como verificar a senha no login:

\n\n
<?php\n// Login do usuário\n$loginPassword = "MinhaSuperS@nha123";\n$storedHash = "$2y$10$..."; // vindo do banco de dados\n\nif (password_verify($loginPassword, $storedHash)) {\n    echo "Senha correta!";\n} else {\n    echo "Senha incorreta.";\n}\n?>
\n\n

Simples, não é? Mas o diabo está nos detalhes. Vamos falar sobre o cost factor.

\n\n

Configuração do cost factor: equilíbrio entre segurança e velocidade

\n\n

Por padrão, o PASSWORD_BCRYPT usa cost factor = 10. Isso significa 2^10 = 1024 iterações. Em um servidor moderno, isso leva cerca de 0,1 a 0,2 segundos. Parece pouco, mas se você tiver 1000 logins simultâneos, o tempo começa a aumentar.

\n\n

Como escolher o cost factor ideal? Existe uma regra simples: ele deve ser tal que o hash de uma senha leve no máximo 0,5 segundo no seu servidor. Você pode testar isso usando a função password_hash() com diferentes valores.

\n\n

Veja um exemplo de teste de performance:

\n\n
<?php\n$password = "senha_teste";\n$times = [];\n\nfor ($cost = 8; $cost <= 14; $cost++) {\n    $start = microtime(true);\n    password_hash($password, PASSWORD_BCRYPT, ['cost' => $cost]);\n    $times[$cost] = microtime(true) - $start;\n}\n\nprint_r($times);\n?>
\n\n

Em uma hospedagem compartilhada típica, o cost factor 10–12 é o ideal. Se você tem um servidor potente, pode subir para 13–14. Mas não exagere: um cost factor muito alto pode fazer seu servidor gastar todos os recursos em hash durante um ataque.

\n\n

Otimização de performance do bcrypt em PHP

\n\n

Agora vamos ao que interessa — como tornar o bcrypt mais rápido sem sacrificar a segurança. Aqui estão algumas estratégias comprovadas:

\n\n

1. Cache de resultados

\n

Se o usuário digitou a senha correta, por que fazer o hash novamente a cada requisição? Você pode armazenar o resultado em cache por um curto período (ex: 5 minutos) usando Redis ou Memcached. Isso é especialmente

Blogs

Book Recommendations