【发布时间】:2013-02-06 04:38:00
【问题描述】:
假设我想为用户存储密码,这是否是使用 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
}
【问题讨论】:
-
嗯,这里有点奇怪,你有array("cost"=>10,后面什么都没有?
-
已修复,对此感到抱歉。
-
我从来不理解盐机制的使用。如果黑客试图暴力访问用户帐户,他们很可能可以访问您的数据库或网络服务器,从中他们可以轻松获取帐户的盐值。 Imo,使用盐机制是安全的误报。
-
那么你应该多读一些,盐的内容比你看起来理解的要多得多。
-
不,但如果你使用拉伸算法(如
password_hash)并增加计算时间,你可以使蛮力/字典攻击变得不那么实用。
标签: php mysql hash passwords php-password-hash