如何正确使用密码_verify与PDO和盐?

时间:2014-04-18 20:00:47

标签: php mysql password-protection

我使用password_ compatibility作为我的密码_功能,我试图用这个密码保护系统来保护我的用户。

首先,我使用password_hash()函数将密码的哈希值存储到数据库中,然后,我想我必须在用户登录时使用password_verify()函数,以便我可以验证如果他(或她)正确输入密码 实际上,我已经陷入了这一步......我想我必须使用 salt hash 才能使用password_verify(),但是我不确切知道如何使用password_hash()创建的盐。我已经阅读了the official guide但我在那里找不到任何帮助......

这是我实际使用的代码:

$connection = new PDO(/*My DB details...*/);
$sql = 'INSERT into users(username, password, mail ,sex) VALUES (:username, :password, :mail, :sex)';

$statement = $connection->prepare($sql);

$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
$statement->bindParam(':username', $_POST['username'], PDO::PARAM_STR, 15);
$statement->bindParam(':password', $password, PDO::PARAM_STR, 30);
$statement->bindParam(':mail', $_POST['mail'], PDO::PARAM_STR, 50);
$statement->bindParam(':sex', $_POST['sex'], PDO::PARAM_STR, 10);
$result = $statement->execute();

现在,我并不确切知道我可以为登录系统使用哪些代码...因为我想我必须使用password_verify(),但我不知道确切知道在哪里以及如何使用它。这实际上是我的登录系统没有密码加密的代码...

$connection = new PDO(/*My connection info...*/);
        $sql = 'SELECT * FROM users WHERE username = :username AND password = :password';

        $statement = $connection->prepare($sql);

        $statement->bindParam(':username', $_POST['username'], PDO::PARAM_STR, 12);
        $statement->bindParam(':password', $_POST['password'], PDO::PARAM_STR, 30);
        $result = $statement->execute();

        if ($result) {
            $result = $statement->fetchAll();
            if (!empty($result)){
                // Other code I have...
            }

那么,你建议我现在使用什么?我真的输了......
谢谢!

PS:我想补充的另一件事是,我认为我应该将每个用户的盐存储在数据库中...我是对的吗?我该怎么办?

1 个答案:

答案 0 :(得分:1)

要验证密码,您必须检索。意味着你必须选择它,而不是在条件下使用。选择后,可以轻松验证。听起来很合理吗?

对于盐,您根本不需要担心 - 它已经存储了。