使用crypt()和password_hash()函数加密后,密码不匹配

Hun*_*Ali 12 php security passwords php-password-hash

我修改了我的旧帖子.我尝试了crypt()函数,现在尝试使用password_hash()和password_verify()来验证来自数据库的加密密码,但在每次调用时,password_hash()函数返回不同的加密字符串,而password_verify()无法匹配.

这就是我这样做的方式.

 //please ignore the syntax error if any

$data = '11';
$dbpass = password_hash($data, PASSWORD_BCRYPT);
echo $dbpass;  // displays the random strings on each page refresh.
Run Code Online (Sandbox Code Playgroud)

一旦密码保存到数据库中,在登录过程中就不会匹配.以下是我的实际功能.

   private function process_data($password){
    $password = __STR.$password.__STR;
    return  password_hash($password, PASSWORD_BCRYPT);

  }
  private function processed($login_password, $dbpassword){
    $login_password = __STR.$login_password.__STR;
    return password_verify($login_password, $dbpassword);
  }
Run Code Online (Sandbox Code Playgroud)

在为密码创建散列字符串的每个函数调用中,该函数下次返回不同的字符串.

irc*_*ell 45

好的,让我们逐一介绍.

首先,它是散列,而不是加密.加密是双向的,散列是一种方式.我们想哈希.我们从不想加密.是的,术语很重要.请使用正确的术语.

接下来,每次调用password_hash应该返回不同的哈希值.那是因为它产生了强烈的随机盐.这就是它的设计方式,以及你应该如何使用它.

此外,请勿__STR在密码前后添加"胡椒"添加内容.你什么都不做,但可能会削弱用户密码(这是不好的).如果你想了解更多关于为什么这是一个坏主意的信息:阅读本答案.

继续,我强烈建议您不要crypt直接使用.它实际上非常容易搞砸并产生极弱的哈希值.这就是password_*api的设计原因.crypt是一个低级库,您希望在代码中使用高级库.有关搞砸bcrypt的方法的更多信息,请查看我的博客:七种方法搞砸Bcrypt.

Password API旨在成为一个简单的一站式商店.如果它不适合您,请检查以下事项:

  1. 你使用PHP> = 5.5.0?或者你使用PHP> = 5.3.7与password_compat

    1. 您的数据库列是否足够宽?

      至少需要60个字符.

    2. 你在检查函数的结果是否为字符串,而不是bool(false)

      如果存在内部错误,则会返回非字符串password_hash.

    3. 你有任何错误吗?

      你有没有打开error_reporting它的最大设置(我建议-1捕获所有内容)并检查代码是否没有抛出任何错误?

    4. 你确定你正确使用它吗?

      function saveUser($username, $password) {
          $hash = password_hash($password, PASSWORD_BCRYPT);
          // save $username and $hash to db
      }
      function login($username, $password) {
          // fetch $hash from db
          return password_verify($password, $hash);
      }
      
      Run Code Online (Sandbox Code Playgroud)

      请注意,每个应该只调用一次.

  2. 您使用PHP <5.3.7与password_compat?如果是这样,这就是你的问题.您在不受支持的PHP版本上使用兼容性库.您可以使用它(某些RedHat发行版已经向后移植了必要的修复程序),但您使用的是不受支持的版本.请升级到合理的版本.

如果所有其他方法都失败了,请尝试运行此代码并报告输出:

$hash = '$2y$04$usesomesillystringfore7hnbRJHxXVLeakoG8K30oukPsA.ztMG';
$test = crypt("password", $hash);
$pass = $test == $hash;

echo "Test for functionality of compat library: " . ($pass ? "Pass" : "Fail");
echo "\n";
Run Code Online (Sandbox Code Playgroud)

如果返回Fail,则表示您运行的是不受支持的PHP版本,应该进行升级.如果它返回pass,则错误在逻辑中的某处(库正常运行).