PHP密码加密问题

时间:2015-04-14 11:56:44

标签: php login password-hash

我正在尝试为我的网站创建一个登录和注册系统,但我想使用比md5更安全的密码加密方法,但我遇到了问题。

function register_user($register_data) {
array_walk($register_data, 'array_sanitize');
$register_data['password'] = password_hash($register_data['password'], PASSWORD_BCRYPT, ['cost' => 10]);

$fields = '`' . implode('`, `', array_keys($register_data)) . '`';
$data = '\'' . implode('\', \'', $register_data) . '\'';

mysql_query("INSERT INTO `users` ($fields) VALUES ($data)");
email($register_data['email'], 'Activate your account', "
Hello " . $register_data['first_name'] . ",\n\nYou need to activate your account, so use the link below:\n\nhttp://thepuzzler.net/activate.php?email=" . $register_data['email'] . "&email_code=" . $register_data['email_code'] . " \n\n -ThePuzzler");      }

这是我的注册功能,我没有遇到过问题,因为当用户注册时,BCRYPT密码存储在我的数据库中。问题是验证用户。

function login($username, $password) {

$user_id = user_id_from_username($username);
$username = sanitize($username);
$password = password_hash($password, PASSWORD_BCRYPT, ['cost' => 10]);

return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'"), 0) == 1) ? $user_id : false;     }

这是我的登录系统,当我尝试登录时,我获取自己的用户名或密码错误是不正确的。这是因为我认为加密的密码不匹配。所以我认为这与我创建$password变量并加密它的行有关。

此外,在我的数据库中,密码列是varchar(64)。谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

password_hash()函数会在每次调用时生成个体盐。要验证密码,您需要password_verify()函数。

因此,您需要从数据库中获取密码哈希,并将其与输入的密码一起传递给password_verify()。

修改 像这样:

function login($username, $password) {
    $usernameForDb = mysql_real_escape_string($username);
    $hashFromDb = mysql_result(mysql_query("SELECT password FROM users WHERE username = '$usernameForDb'")); 
    $isValid = password_verify($password, $hashFromDb); 
    if ($isValid) {
        // user is accepted, get userID
        return user_id_from_username($username);
    }
    return false;
}