2015-05-30 157 views
0

我已经开始使用password_hash()进行密码散列。我遇到的问题是,当我使用password_verify()检查输入值是否与存储在数据库中的散列密码相匹配时,每次都返回false。PHP:密码散列

$password = "test"; 

    $query = "SELECT password FROM user WHERE password = :pass "; 
    $statement = $connection->prepare($query); 
    $statement->bindParam(":pass", $password); 
    $statement->execute(); 

    if(password_verify($password, $row['password'])){ 
    echo "Password Valid"; 
    } 

    else { 
    echo "Invalid Password"; 
    } 

但是,如果e.g我从数据库中复制单个哈希密码值,并把它放在$行[“密码”]的地方,当我测试的代码,它返回我真。

if(password_verify($password, '$2y$10$kc09i9YSP.ExmUquMqRnf......')){ 
    echo "Password Valid"; 
    } 

请帮忙。

+0

检查以下链接 http://stackoverflow.com/questions/19855715/php-password-hash-and-password-verify-issues-no -match 谢谢! –

+1

'SELECT password WHERE password =:password' - really‽ – deceze

回答

3

回答第一个问题是,你正在尝试使用SQL来查找散列密码。标准程序是使用给定的用户名找到用户,并获取该用户的密码以便验证。

您的其他问题是致电$row['password'],但您尚未在您的代码中实际设置它。首先获取行,然后您可以验证密码。

像这样的东西应该工作:

$username = "test"; 

$query = "SELECT password FROM user WHERE username = :username "; 
$statement = $connection->prepare($query); 
$statement->bindParam(":username", $username); 
$statement->execute(); 
$row = $statement->fetch(); 

if(password_verify($password, $row['password'])){ 
    echo "Password Valid"; 
} 
else { 
    echo "Invalid Password"; 
} 
+0

非常感谢你:) –

+0

我很高兴它有帮助! :) –

-1

替换:

$statement->bindParam(":pass", $password); 

有了:

$statement->bindParam(":pass", password_hash($password, PASSWORD_DEFAULT)); 

请使用乔尔欣茨