PHP使用bCrypt登录

时间:2016-01-09 13:37:24

标签: php 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;
}

1 个答案:

答案 0 :(得分:7)

查看官方文档中的示例:password_verify

该函数接受两个参数:

  1. 用户提供(纯文本)密码
  2. 来自数据库的哈希密码
  3. 这方面的流程是:

    1. 根据用户名/ emailaddress /任意标识符从数据库中检索用户密码 hash
    2. 使用password_verify
    3. 验证密码

      所以你的代码应该是这样的:

      $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';