2015-04-22 60 views
0

有人可以告诉我如何当某人登录时验证散列密码吗?如何验证用户登录时的散列密码

这里是我的注册代码:

$db_password = password_hash($password, PASSWORD_DEFAULT); 

// Enter info into the Database. 
$info2 = htmlspecialchars($info); 
$sql = mysql_query("INSERT INTO users 
        (first_name, last_name, email_address, username, password, signup_date) 
        VALUES('$first_name', '$last_name', 
          '$email_address', '$username', 
          '$db_password', now())") 
       or die (mysql_error()); 

这是在登录时运行我的检查用户代码。 。

$hash = password_hash($password, PASSWORD_DEFAULT); 

// check if the user info validates the db 
$sql = mysql_query("SELECT * 
        FROM users 
        WHERE username='$username' 
         AND password='$hash' 
         AND activated='1'"); 
$login_check = mysql_num_rows($sql); 

我找不出来。

+0

忘记登录时我正在会见凭据无效消息 – user3205214

+2

当您检查口令来添加的,你看从现有的散列数据库并使用[password_verify()](http://www.php.net/manual/en/function.password-verify.php)检查用户输入的密码 –

+0

请[停止使用'mysql_ *'函数](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php)。他们不再被维护,并[正式弃用](https://wiki.php.net/rfc/mysql_deprecation)。了解[准备的陈述](http://en.wikipedia.org/wiki/Prepared_statement),并使用[PDO](http://jayblanchard.net/demystifying_php_pdo.html)。另外,你在查询中使用变量的方式会让我相信你可能是[SQL注入。]的受害者(http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection -in-php) –

回答

2

你的验证是错误的...你再次哈希密码,这将导致一个全新的盐...因此一个完全不同的哈希值。当密码被散列(正确)时,他们使用足够长的盐(随机字符串)来防止彩虹攻击。 password_hash正在幕后为你做这一切。

但是,这意味着您必须确保使用相同的盐,以便通过将密码与散列一起存储来验证密码。在你使用的代码的情况下,它正在为你做这部分,盐是password_hash结果的前缀。

当用户登录时,你需要做的:

if(password_verify($loginPasswordText, $hashStoredInDb)) { 
    //SUCCESS 
} 
0

无需密码在登录时再次散列,使用简单password_verify()功能在登录时间确认您存储的密码&给定的密码。查看更多有关密码散列API这里http://php.net/manual/en/ref.password.php

现在试试这个样子,

<?php 
    // this is the example hashed password that you have to select from Database. 
    $hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; 

    if (password_verify('password_given_at_login', $hash)) { 
     echo 'Password is valid!'; 
    } else { 
     echo 'Invalid password.'; 
    } 
    ?>