PHP 使用 bCrypt 登录
PHP Login with bCrypt
我正在尝试将密码从 SHA1 切换到 bCrypt。
注册工作正常,但我在登录时遇到问题。
谁能帮帮我?
这就是我所拥有的,但它不起作用。
$SQLCheckLogin = $odb -> prepare("SELECT COUNT(*) FROM users WHERE username = :username AND password = :password");
$passwordverified = password_verify($password);
$SQLCheckLogin -> execute(array(':username' => $username, ':password' => $passwordverified));
$countLogin = $SQLCheckLogin -> fetchColumn(0);
password_verify 函数
function password_verify($password, $hash) {
if (!function_exists('crypt')) {
trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING);
return false;
}
$ret = crypt($password, $hash);
if (!is_string($ret) || strlen($ret) != strlen($hash) || strlen($ret) <= 13) {
return false;
}
$status = 0;
for ($i = 0; $i < strlen($ret); $i++) {
$status |= (ord($ret[$i]) ^ ord($hash[$i]));
}
return $status === 0;
}
看官方文档上的例子:password_verify.
该函数接受两个参数:
- 用户提供的 (plain-text) 密码
- 来自数据库的散列密码
这个流程是:
- 根据username/emailaddress/whatever标识符
从数据库中检索用户密码hash
- 使用
password_verify
验证密码
所以你的代码应该是这样的:
$SQLCheckLogin = $odb -> prepare("SELECT password FROM users WHERE username = :username");
$SQLCheckLogin -> execute(array(':username' => $username));
$hash = $SQLCheckLogin->fetchColumn(0);
if ($hash === false || !password_verify($password, $hash)) {
// you should handle this proper
die('Failed login');
}
echo 'Logged in';
请注意,您还应检查是否需要更新哈希。 password_*
API 是在考虑向前兼容性的情况下创建的。这意味着当 PHP 中出现更好/更安全的哈希算法时,您可以(并且应该)自动更新您的 "old" 密码。
这个函数是password_needs_rehash
检查密码是否需要更新:
$SQLCheckLogin = $odb -> prepare("SELECT password FROM users WHERE username = :username");
$SQLCheckLogin -> execute(array(':username' => $username));
$hash = $SQLCheckLogin->fetchColumn(0);
if ($hash === false || !password_verify($password, $hash)) {
// you should handle this proper
die('Failed login');
}
if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 14])) {
$SQLUpdateLogin = $odb -> prepare("UPDATE users SET password = :password WHERE username = :username");
$SQLUpdateLogin -> execute(array(
':username' => $username,
':password' => password_hash($password, PASSWORD_DEFAULT, ['cost' => 14]),
));
}
echo 'Logged in';
我正在尝试将密码从 SHA1 切换到 bCrypt。 注册工作正常,但我在登录时遇到问题。 谁能帮帮我?
这就是我所拥有的,但它不起作用。
$SQLCheckLogin = $odb -> prepare("SELECT COUNT(*) FROM users WHERE username = :username AND password = :password");
$passwordverified = password_verify($password);
$SQLCheckLogin -> execute(array(':username' => $username, ':password' => $passwordverified));
$countLogin = $SQLCheckLogin -> fetchColumn(0);
password_verify 函数
function password_verify($password, $hash) {
if (!function_exists('crypt')) {
trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING);
return false;
}
$ret = crypt($password, $hash);
if (!is_string($ret) || strlen($ret) != strlen($hash) || strlen($ret) <= 13) {
return false;
}
$status = 0;
for ($i = 0; $i < strlen($ret); $i++) {
$status |= (ord($ret[$i]) ^ ord($hash[$i]));
}
return $status === 0;
}
看官方文档上的例子:password_verify.
该函数接受两个参数:
- 用户提供的 (plain-text) 密码
- 来自数据库的散列密码
这个流程是:
- 根据username/emailaddress/whatever标识符 从数据库中检索用户密码hash
- 使用
password_verify
验证密码
所以你的代码应该是这样的:
$SQLCheckLogin = $odb -> prepare("SELECT password FROM users WHERE username = :username");
$SQLCheckLogin -> execute(array(':username' => $username));
$hash = $SQLCheckLogin->fetchColumn(0);
if ($hash === false || !password_verify($password, $hash)) {
// you should handle this proper
die('Failed login');
}
echo 'Logged in';
请注意,您还应检查是否需要更新哈希。 password_*
API 是在考虑向前兼容性的情况下创建的。这意味着当 PHP 中出现更好/更安全的哈希算法时,您可以(并且应该)自动更新您的 "old" 密码。
这个函数是password_needs_rehash
检查密码是否需要更新:
$SQLCheckLogin = $odb -> prepare("SELECT password FROM users WHERE username = :username");
$SQLCheckLogin -> execute(array(':username' => $username));
$hash = $SQLCheckLogin->fetchColumn(0);
if ($hash === false || !password_verify($password, $hash)) {
// you should handle this proper
die('Failed login');
}
if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 14])) {
$SQLUpdateLogin = $odb -> prepare("UPDATE users SET password = :password WHERE username = :username");
$SQLUpdateLogin -> execute(array(
':username' => $username,
':password' => password_hash($password, PASSWORD_DEFAULT, ['cost' => 14]),
));
}
echo 'Logged in';