假设我想存储用户的密码,这是否是使用 PHP 5.5 的正确方法password_hash()
函数(或 PHP 5.3.7+ 的此版本:https://github.com/ircmaxell/password_compat 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
返回包含两者的字符串。
The 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 注入的文章:http://php.net/manual/en/security.database.sql-injection.php http://php.net/manual/en/security.database.sql-injection.php
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)