我发现这个帖子很有用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);
如果你对这个话题有更深入的兴趣,你可以看看我关于安全存储密码的教程。