我发现这篇文章很有帮助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}')
我的查询?这看起来有点笨拙。
答案 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关于安全存储密码的信息。