关于我的散列函数的奇怪问题

时间:2014-07-07 01:46:14

标签: php hash bcrypt blowfish

我在两个不同的functions.php区域使用两次完全相同的功能。

  1. 进入安装程序后 - 当用户注册时。
  2. 当用户登录时,主脚本中有两次。
  3. 注册输出

     username: admin
     password: 12345678
     hashed password: $2y$12$$$$$$$$$$$$$$$$$$$$$$.ibwcWrMlgLR7y6B62/Vc8Dc54kecHHe$1$ZQhX9D2d$RexVJ.y2KWpfxMyY0tN9E1
     salt: HJsZ4yBWNbGQCw1Yi-7rGBunXym7AEIFatIHhaK_fQgY6I1ecqAEs7eAmJM88Zdn5VpdrKie2CN39~PjqSb3yoPCCzl4q8
     vsalt: S2qXSXQUc-
    

    登录输出(相同输入)

      username: admin
      password: 12345678
      hashed password: *0S2k0u9.1hnFr.
      salt: HJsZ4yBWNbGQCw1Yi-7rGBunXym7AEIFatIHhaK_fQgY6I1ecqAEs7eAmJM88Zdn5VpdrKie2CN39~PjqSb3yoPCCzl4q8
      vsalt: S2qXSXQUc-
    

    散列函数的代码

    function hashing($password ,$salt ,$vsalt){
        $check1 = crypt($password.$salt,'$2y$12$'.$vsalt);
        $check2 = crypt($password.$salt,$vsalt);
        //password will be: $check1.$check2
        return($check1.$check2);
    }
    

    问题:

    散列密码看起来并不完全相同

2 个答案:

答案 0 :(得分:4)

有两件事情跳出来:

  1. 用于Bcrypt的盐具有[./A-Za-z0-9]的有限“字母”,因此不应使用连字符。
  2. 盐的长度应为22个字符。
  3. 最后,恕我直言,因为你正在使用Bcrypt的盐,你真的不需要另外一个盐来填充密码。

    以下功能应该可以正常工作:

    function hashing($password, $salt, $cost = 12)
    {
        assert(preg_match('/^[A-Za-z0-9.\/]{22}$/', $salt);
        return crypt($password, '$2y$' . str_pad($cost, 2, '0', STR_PAD_LEFT) . '$' . $salt);
    }
    

    那就是说,你应该使用自5.5以来已包含在核心中的password hashing API。对于旧版本,您可以使用password compat来实现相同的界面。

答案 1 :(得分:-2)

我的解决方案:

功能:

function hashing($password ,$salt ,$vsalt){
    $blowFishSalt = '$2y$12$'.$vsalt.$salt.'$';
    $check1 = crypt($password.$salt,$blowFishSalt);
    //password will be: $check1.$check2
    return($check1);
}

返回* 0的主要问题(失败代码也可以是:* 1):

 my blowfish salt: $2y$12$_RANDOM_STRING_ 
 Correct blowfish salt standards: $2y$12$_RANDOM_STRING_$

感谢任何想要帮助的人!

度过美好的一天!