用PHP比较MySql密码()

时间:2014-03-20 22:21:57

标签: php mysql passwords

我发现这篇文章很有帮助MySQL password() function to PHP,但我无法将解决方案应用于我的问题。

使用Password()将密码存储在Mysql中。我想调整这个脚本来比较输入的密码和存储在数据库中的密码,而不是使用'crypt()'函数。

    public function authenticate($user,$pass) {
        $mysqli = new mysqli(DBHOST,DBUSER,DBPASS,DB);
        if ($mysqli->connect_errno) {
        error_log("Cannot connect to MySQL: " . $mysqli->connect_error);
        return false;
        }
        $safeUser = $mysqli->real_escape_string($user);
        $incomingPassword = $mysqli->real_escape_string($pass);
        $query = "SELECT * from users WHERE username ='{$safeUser}'";
        if (!$result = $mysqli->query($query)) {
            error_log("Cannot retrieve account for {$user}");
            return false;
        }

        // Will be only one row, so no while() loop needed
        $row = $result->fetch_assoc();
        $dbPassword = $row['password'];
        if (crypt($incomingPassword,$dbPassword) != $dbPassword) {
        error_log("Passwords for {$user} don't match");
        return false;
        }
        $this->id = $row['id'];
        $this->firstName = $row['first_name'];
        $this->lastName = $row['last_name'];            
        $this->username = $row['username'];
        $this->email = $row['email'];
        $this->dateJoin = $row['dateJoin'];
        $this->school = $row['school'];
        $this->level = $row['level'];
        $this->isLoggedIn = true;
        $this->_setSession();
        return true;
    } //end function authenticate

是否有一种简单的方法来调整此脚本?我只是添加

AND `password` = PASSWORD('{$incomingPassword}')

我的查询?这看起来有点笨拙。

1 个答案:

答案 0 :(得分:1)

您是否真的确定使用MySql Password()函数进行哈希处理的密码,因为此函数是not meant to be used in applications可以安全地存储密码并直接在SQL查询中验证密码。

你真的应该使用像BCrypt这样的缓慢散列函数,并且必须使用salting。这意味着,您需要一个两步过程,首先通过带有SQL查询的用户名获取存储的密码哈希,然后从哈希中提取salt并进行验证。

使用PHP散列密码的推荐方法是新函数password_hash()

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

如果您对有关此主题的更深入信息感兴趣,可以查看我的tutorial关于安全存储密码的信息。