2016-02-26 238 views
-1

我在使用password_hash和password_verify函数验证密码时遇到了麻烦。 由于某些原因,它总是返回false。PHP - password_verify总是返回false

散列存储在数据库中,当用户提供电子邮件和密码时,如果存在提供的电子邮件的用户记录,则提供的通过和来自该用户记录的散列被验证(这将返回false ,提供正确的密码)。

代码波纹管是用于测试目的,因为它不是在真实背景下正常工作(与存储在数据DATABSE)

继承人一些代码。

<?php 
     //create random password with 15 chars 
     $pass = generate_random_string(15); 
     $hash = password_hash($pass, PASSWORD_BCRYPT); 
     var_dump(password_verify($pass, $hash)); 
     //returns bool(true) 

直到这一部分一切正常,它创建一个pass,哈希它,当验证返回true时。 现在怪异的部分。

 if (isset($_GET['pass']) && 
      isset($_GET['hash'])) { 

      var_dump(password_verify($_GET['pass'], $_GET['hash'])); 
      //returns bool(false) 
     } 
    ?> 

如果我采用先前生成的值(pass和hash)并传递它们具有url参数并验证它们,则返回false。

我在这里做错了什么?

UPDATE

转储$ _GET数组显示正确的参数和值。

+0

您需要提供'password_verify'功能以及 – Derek

+0

可以还转储$ _GET数组 - 我认为你可能会假设一些在那里不正确的东西...... –

+1

当用户发送密码时,'hash'是否应该被存储和使用? –

回答

2

试戴追加到URL编码前值:

$pass = generate_random_string(15); 
$hash = password_hash($pass, PASSWORD_BCRYPT); 
var_dump(password_verify($pass, $hash)); 
$pass_encoded = urlencode($pass); // PASS THIS IN THE URL 
$hash_encoded = urlencode($hash); // PASS THIS IN THE URL 

而对其进行解码:

if (isset($_GET['pass']) && isset($_GET['hash'])) { 
    var_dump(password_verify(urldecode($_GET['pass']), urldecode($_GET['hash']))); 
} 
+0

Bamn。看起来你几秒钟就打败了我。 –

+0

对不起,但这不能解决问题,返回相同的结果。不管怎么说,还是要谢谢你 –