在php中存储和检索密码的最佳方法是什么?

时间:2019-06-28 06:31:54

标签: php passwords

在创建用户时使用的password_hash()。

public function create($username, $pass, $user_details) {
        if (!$this->user_exists($username)) {
          $table = 'users';
          $fields_arr = [
            'username' => $username,
            'password' => password_hash($password,PASSWORD_DEFAULT)
          ];
          $fields_arr += $user_details;
          $fields = array_keys($fields_arr);
          $values = array_values($fields_arr);
          return $this->database->insertQuery($table, $fields, $values);
        }
        return [];
      }

password_verify()在用户登录时使用。

public function user_login($username, $password) {
     //@todo how to add variables
     $rows = $this->database->selectQuery('users', '*', [
       [ 
         'field' => 'username',
         'operator' => '=',
         'value'=>$username
       ]
      ]
     );
     if (!$rows || password_verify($rows['password'], self::HASH)) {
       echo "Username or Password does not exists/match.";  
       mysqli_close($this->database->conn);
     }
     else {
         // @todo do we need to set setSession as given below ??
       $this->setLoggedInSession($username);
       $user_obj = new User();
       $user = $user_obj->load($_POST['username']);
       setcookie('first_name', $user['first_name']);

       header("location: welcome.php");
     }
   }

我已经在HASH下定义了一个常量。在使用password_hash()时需要使用该常量,但我发现要使用我们需要使用PASSWORD_BCRYPT并添加盐据说已被弃用,因此理想的存储密码方式应该是?

  

PASSWORD_BCRYPT支持的选项:

     

盐(字符串)-手动提供在对哈希值进行哈希处理时要使用的盐   密码。请注意,这将覆盖并防止盐分   自动生成。

     

如果省略,password_hash()将为生成随机盐   每个密码都经过哈希处理。这是预期的操作模式。

     

警告从PHP 7.0.0起不建议使用salt选项。就是现在   首选仅使用默认情况下生成的盐。

https://www.php.net/manual/en/function.password-hash.php

https://www.php.net/manual/en/function.password-verify.php

0 个答案:

没有答案