PHP crypt无法正确匹配

时间:2014-09-30 18:37:50

标签: php passwords crypt

我正在尝试使用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()crypt hash = $ 2a $ 10 $ y / WXEmlCb6392Wpf8FMpq.s8Y6lrJGDMOAJ4d8GffQUEiAWKsEyqS

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

任何人都能解开一些光明吗?感谢。

2 个答案:

答案 0 :(得分:0)

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

P.S。为什么不使用password php扩展名?

P.S.S。不要创建自己的盐生成功能。 str_shuffle - 对于crypt函数不安全。 mt_rand也是。最好在已经实现盐生成的情况下使用密码扩展。

答案 1 :(得分:0)

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

无论如何,你很可能会使用新的password_hash()函数,我建议你这样做。 PHP版本5.3.7及更高版本可以使用compatibility pack。即使使用5.3,也可以使用较小的改动。