Bcrypt em PHP: como hashear senhas de forma rápida e sem erros
\n\nVocê já se perguntou por que seu site em PHP fica lento ao registrar usuários? Ou, pior ainda, por que hackers ainda conseguem roubar senhas do seu banco de dados? A resposta pode estar em como você usa o bcrypt para hashear senhas em PHP.
\n\nEsta questão é uma das mais populares no Stack Overflow (milhares de visualizações!). E não é surpresa: a segurança de senhas é um tema onde um único erro pode custar sua reputação e os dados dos seus usuários. Mas hoje não vamos apenas analisar como usar password_hash com bcrypt. Vamos falar sobre otimização e desempenho. Porque, convenhamos, esperar 5 segundos ao fazer login não é legal.
Vamos entender como tornar o hasheamento de senhas em PHP não apenas seguro, mas também rápido. Vamos lá!
\n\nPor que bcrypt? E por que não MD5 ou SHA?
\n\nMuitos iniciantes (e, infelizmente, alguns "experientes") ainda usam md5() ou sha1(). É como fechar uma porta com um trinco de plástico — parece fechado, mas basta um sopro para abrir. MD5 e SHA são hashes rápidos. Rápidos demais. Um hacker com uma GPU moderna pode processar bilhões desses hashes por segundo.
Bcrypt é uma abordagem fundamentalmente diferente. Ele foi projetado para ser lento. Ele usa "salt" (dados aleatórios) e um "cost factor" (fator de custo) que força o algoritmo a demorar mais. Enquanto um hacker calcula um único hash bcrypt, ele poderia processar um milhão de MD5. É por isso que o bcrypt é o padrão de facto em PHP.
\n\nFundamentos: como usar bcrypt em PHP corretamente
\n\nA partir do PHP 5.5, temos a função mágica password_hash(). Esqueça a adição manual de salt e a chamada de crypt() — tudo já foi feito para você.
Veja como é o hasheamento correto de senha com bcrypt:
\n\n<?php\n// Hasheando a senha\n$password = 'MySuperSecretPassword123!';\n$hash = password_hash($password, PASSWORD_BCRYPT);\n\necho $hash;\n// Saída: $2y$10$... (string de 60 caracteres)\n?>\n\nPronto! O password_hash gera automaticamente um salt aleatório e escolhe o cost factor ideal (padrão 10). E como verificar a senha no login?
<?php\n// Verificando a senha\n$inputPassword = 'MySuperSecretPassword123!';\n$hashFromDB = '$2y$10$...'; // o hash do banco de dados\n\nif (password_verify($inputPassword, $hashFromDB)) {\n echo "Senha correta! Bem-vindo.";\n} else {\n echo "Senha incorreta. Tente novamente.";\n}\n?>\n\nSimples, não é? Mas o diabo, como sempre, está nos detalhes. Vamos falar sobre o mais importante: o desempenho.
\n\nOtimização do bcrypt: como encontrar o equilíbrio entre segurança e velocidade
\n\nO principal parâmetro que afeta o desempenho do bcrypt em PHP é o cost factor (custo). Ele é definido como segundo argumento em password_hash() como um array ['cost' => 12].
O que é cost? É uma escala logarítmica. Cada unidade aumenta o tempo de execução em aproximadamente 2 vezes.
\n\n- \n
- Cost = 10 (padrão): ~0,1-0,2 segundos. Rápido, mas para 2024 já é um pouco baixo. \n
- Cost = 12: ~0,4-0,8 segundos. Um bom equilíbrio para a maioria dos projetos. \n
- Cost = 14: ~1,5-3 segundos. Muito seguro, mas os usuários podem ficar impacientes. \n
- Cost = 16+: >5 segundos. Apenas se você for um espião ou estiver guardando códigos nucleares. \n
Como escolher o cost ideal? Existe uma regra simples: no seu servidor, o hasheamento de uma senha deve levar no máximo 250-500 milissegundos. Isso é imperceptível para o usuário, mas torna um ataque de força bruta caro demais para o hacker.
\n\n