使用PHP比较MySql密码()


Using PHP to compare MySql Password()

我发现这个帖子很有用MySQL password()函数到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}')

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

你真的确定密码是用MySql Password()函数散列的吗,因为这个函数不打算在应用程序中使用?可以直接在sql查询中安全存储密码和验证密码。

你真的应该使用像BCrypt这样的慢散列函数,并且盐是强制性的。这意味着,您需要一个两步的过程,首先使用sql查询根据用户名获取存储的密码哈希,然后从哈希中提取盐并进行验证。

使用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);

如果你对这个话题有更深入的兴趣,你可以看看我关于安全存储密码的教程。