PHP密码不正确匹配


PHP crypt not matching correctly

我正在尝试使用PHP crypt()创建一个基本的密码哈希/验证方案。我现在无法升级到PHP 5.5.0,所以我不能使用password_hash()和password_verify()。

我的代码如下:

function myinit_salt()
  {
    $options = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
    for ($i = 0; $i <= 20; $i ++) {
      $options = str_shuffle ( $options );
      $salt .= $options [rand ( 0, 63 )];
    }
    return $salt;
  }

(注册时加密用户提供的密码)。。。

$salt = myinit_salt();
$blowfish = '$2a$10$';
$enc_pw = crypt($userinput['password'], $blowfish . $salt);

(将加密密码存储在数据库中)。。。

(在尝试登录时根据用户提供的密码验证存储的密码)。。。

function verify_password($input_password, $db_password)
  {
    if ($input_password) {
      if (crypt($input_password, $db_password) == $db_password) {
        //authenticated
        return true;
      } else return false;
    } else return false;
  }

即使用户提供的密码匹配,也会返回false。所以我让verify_password()吐出它正在使用的值,这就是给出的值:

用户提供的密码($input_password)=abcxyz123

$db_password=$2a$10$y/WXEmlCb6392Wpf8FMpq.FuwwnaSU51x/xPdFYlTl5y6Bsn51Nzi

verify_password()密码散列=$2a$10$y/WXEmlCb6392Wpf8FMpq.s8Y6lrJGDMOAJ4d8GffQUEiAWKsEqS

因此,看起来salt匹配,但由于某种原因,密码哈希不匹配。

有人能透露一些信息吗?谢谢

您的myinit_salt 中有两个错误

function myinit_salt()
  {
    $options = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
    $salt = ''; // without it notice would be raised
                     // v
    for ($i = 0; $i <= 21; $i ++) {             // <--- length of salt should be 22
                     // ^ 
      $options = str_shuffle ( $options );
      $salt .= $options [rand ( 0, 63 )];
    }
    return $salt;
  }

http://php.net/manual/en/function.crypt.php

附言:为什么不使用php扩展密码?

p.S.S.不要创建自己的盐生成函数。str_shuffle-对于密码函数是不安全的。mt_rand。最好在已经实现salt生成的地方使用密码扩展。

verify_password()函数中生成的哈希值生成一个有效的BCrypt哈希,该哈希值具有与存储的哈希值相同的参数和盐。这实际上只留下了另一种选择,即输入是不同的$userinput['password'] != $input_password

无论如何,您很可能可以使用新的password_hash()函数,我建议您这样做。有一个兼容包可用于PHP 5.3.7及更高版本。即使使用5.3,也可以在进行小改动的情况下使用它。