查看官方文档中的示例:password_verify.
该函数接受两个参数:
用户提供(纯文本)密码
来自数据库的哈希密码
这个流程是:
根据用户名/ emailaddress /任何标识符从数据库中检索用户密码哈希
使用验证密码 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中提供更好/更安全的散列算法时,您可以(并且应该)自动更新"旧"密码.
这个功能是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';