假设我想为用户存储密码,这是否是使用 PHP 5.5 的 password_hash()
函数(或 PHP 5.3.7+ 的此版本: https://github.com/ircmaxell/password_compat)?
$options = array("cost" => 10, "salt" => uniqid());
$hash = password_hash($password, PASSWORD_BCRYPT, $options);
那么我会这样做:
mysql_query("INSERT INTO users(username,password, salt) VALUES($username, $hash, " . $options['salt']);
插入数据库。
然后去验证:
$row = mysql_fetch_assoc(mysql_query("SELECT salt FROM users WHERE id=$userid"));
$salt = $row["salt"];
$hash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 10, "salt" => $salt));
if (password_verify($password, $hash) {
// Verified
}
最佳答案
暂时忽略你的数据库语句的问题,我将回答有关password_hash
的问题。
简而言之,不,这不是你的做法。您不想单独存储盐,您应该同时存储哈希和盐,然后使用两者来验证密码。 password_hash
返回一个包含两者的字符串。
password_hash
函数返回一个包含哈希值和盐值的字符串。所以:
$hashAndSalt = password_hash($password, PASSWORD_BCRYPT);
// Insert $hashAndSalt into database against user
然后去验证:
// Fetch hash+salt from database, place in $hashAndSalt variable
// and then to verify $password:
if (password_verify($password, $hashAndSalt)) {
// Verified
}
此外,正如评论所暗示的,如果您对安全性感兴趣,您可能需要查看 mysqli
(ext/mysql
在 PHP5.5 中已弃用),还有这篇关于 SQL 注入(inject)的文章:http://php.net/manual/en/security.database.sql-injection.php
关于php - 使用 PHP 5.5 的 password_hash 和 password_verify 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14992367/