Bcrypt em PHP: como fazer hash de senhas de forma correta e rápida
\n\nSe 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\nPor 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\nO que é bcrypt e por que ele é melhor que MD5 ou SHA1?
\n\nVamos 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\nNo 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.
Como usar bcrypt em PHP: exemplo básico
\n\nVamos 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\nE 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\nSimples, não é? Mas o diabo está nos detalhes. Vamos falar sobre o cost factor.
\n\nConfiguração do cost factor: equilíbrio entre segurança e velocidade
\n\nPor 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.
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.
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\nEm 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\nOtimização de performance do bcrypt em PHP
\n\nAgora vamos ao que interessa — como tornar o bcrypt mais rápido sem sacrificar a segurança. Aqui estão algumas estratégias comprovadas:
\n\n1. Cache de resultados
\nSe 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