Verificar Login com senha criptografada BCrypt

Tenho um banco de dados com usuário e senha (gerado usando BCrypt), porém não consigo fazer a verificação da senha, comparando a senha digitada no campo com a senha do banco. 
Antes dessa comparação eu chamo a função BCrypt novamente, e ela gera uma outra hash, ai então nunca dá a hash que está no banco. Me falaram que eu teria que fornecer a hash que está no banco pra fazer essa comparação. Mas com todas as senhas eu terei que fazer isso, ou eu puxo do banco e armazeno temporariamente em uma sessão por exemplo? 
Segue meu código: 

`<?php
include(“Bcrypt.php”);

$usuario = $_POST['user'];
$passwd =  $_POST['password'];
$hash = Bcrypt::hash($passwd); 
	

$conecta = mysql_connect("localhost", "root", "") or print (mysql_error()); 
print "Conexão OK!"; 

if($conecta)
{
$baseSelecionada = mysql_select_db("gestaoescolar");
if ($baseSelecionada) {
		print "Banco selecionado!";
	
} 
} else {
	die('Não conectado : ' . mysql_error());
}
	
print " ".$hash; 
$queryRetorno = "SELECT * FROM usuario WHERE nome='".$usuario."' AND senha='".$hash."' " ;
$buscar = mysql_query($queryRetorno, $conecta);

print " ".mysql_num_rows($buscar);
while($registro = mysql_fetch_assoc($buscar)){

	if (Bcrypt::check($passwd, $registro["senha"]) && $usuario == $registro["nome"]) {
		print "1";
	} else {
		print "0";
	}	
		
}
mysql_close($conecta);

?>`

Bom, na minha opinião você está usando códigos desnecessários. Como você já criou um hash com a variável $hash, não precisaria de colocar aquele while e nem os IFs dentro…

Eu faria assim para fins de teste:
1 - remover todo o while com o seu conteúdo;
2 - usar o num_rows para validar pelo fato de já ter feito a consulta sql logo acima.

Essa parte de validação ficaria mais ou menos assim:

$res = mysql_num_rows($buscar);

if ($res != 1) {
// bloqueia, destrói as sessões e redireciona para a tela de login ou outra página
exit;
}

Já pensou em usar sha1 ou sha 256, etc? Eu acho bem mais fácil a manipulação para este fim.

Agora um conselho: Pesquise sobre PDO. facilita bastante o projeto, pois se precisar trocar o banco de dados, somente precisará trocar uma linha código. As funções MySql estão caindo em desuso no php.

Até+

Sim, já vi as implementações do PDO. Estou fazendo a lógica de teste, depois implementarei o PDO. Deu certo aqui, eu não estava usando o mesmo salt da geração com o que tava no banco, ai realmente não tinha como dar certo.

Abraço.

1 curtida