【发布时间】:2017-06-17 13:42:10
【问题描述】:
我有一个用于登录应用程序的处理文件。我要么不明白password_needs_rehash() 的目的,要么它不起作用。登录正在验证并将我传递到正确的页面。但我什至无法让代码回显新的哈希值。
我这样做对吗?
if 不会因为不需要重新散列而引发新散列吗?如果是这样,如果密码被正确散列并存储在数据库中,什么时候需要重新散列?
我的处理文件如下:
$email = $_POST["li_email"];
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$stmt = $conn->query("SELECT * FROM users WHERE email='$email'");
$stmt->execute();
while($row=$stmt->fetch()){ //for each result, do the following
$hash = $row['hash'];
$userPassword = $_POST["li_password"];
if (password_verify($userPassword, $hash)) {
if ( password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12]) ) {
$newhash = password_hash($userPassword, PASSWORD_DEFAULT, ['cost' => 12]);
echo $newhash;
}
} else {
header('Location: http://' . $_SERVER['HTTP_HOST'] . '?error=loginfailed');
exit();
}
}
} catch(PDOException $e) {
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
感谢您的帮助!
【问题讨论】:
-
如果您更改
cost,则需要重新哈希。 -
我明白了。 NOOB 问题:我为什么要更改成本?如果我这样做,它不会在
user第一次登录后重新散列,因为新散列的成本会改变?还是我想随机化成本? -
cost越多,将原始密码转换为可用于验证密码的哈希所需的 CPU 时间就越多。成本越高,“破解”它就越困难。那你为什么要改变它?好吧,也许当 CPU 速度提高时,或者您转移到多个 CPU 执行相同操作并且负载平衡的云中。无论哪种方式,10都足够了。 -
好的,所以它是一个面向未来的代码?就像它从现在开始的 2 年一样,CPU 变得更快了,这意味着我设置的成本不太安全,现在我提高了与时俱进的成本?
-
差不多,是的。不需要更改代码或任何东西,只需在登录时验证它是否需要重新哈希并自行决定更改成本。
标签: php login php-password-hash