为什么crypt()会产生不同的结果?

时间:2012-08-15 17:28:06

标签: php encryption passwords blowfish crypt

Crypt使用相同的输入数据生成不同的哈希值,并且[以下]以前使用的函数哈希生成器/检查不再用于验证用户:

public static function blowfish($password, $storedpass = false) {
    //if encrypted data is passed, check it against input ($info) 
      if ($storedpass) { 
            if (substr($storedpass, 0, 60) == crypt($password, "$2y$08$".substr($storedpass, 60))) { 
                return true; 
            }  else { 
                return false; 
            } 
      }  else { 
          //make a salt and hash it with input, and add salt to end 
          $salt = ""; 
          for ($i = 0; $i < 22; $i++) { 
            $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1); 
          } 
          //return 82 char string (60 char hash & 22 char salt) 
          return crypt($password, "$2y$08$".$salt).$salt; 
     }
}

我正在撞墙,并没有找到Zend内部算法与PHP与操作系统算法之间差异的答案;或者PHP 5.3.8与之前的变化......

编辑:我的问题在技术上得到了解答,而且我没有正确地提出问题,这是我的错。我已经实施了:

$salt = substr(bin2hex(openssl_random_pseudo_bytes(22)), 0, 22);
          //for ($i = 0; $i < 22; $i++) { 
            //$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1); 
          //} 

我真正的问题是;为什么以下函数的返回方式不同?

print(substr($storedpass, 0, 60)."<br />");

返回:$ 2y $ 08 $ 43f053b1538df81054d4cOJyrO5 / j7NtZBCw6LrFof29cLBs7giK6

print(crypt($password, "$2a$08$".substr($storedpass, 60)));

返回:$ 2a $ 08 $ 43f053b1538df81054d4cOPSGh / LMc0PZx6RC6PlXOSc61BKq / F6。

1 个答案:

答案 0 :(得分:1)

因为您是在随机数的帮助下创建salt

函数mt_rand()每次调用时都会创建随机数,可选择使用min,max参数。通常对于强密码密码哈希,应使用密码安全伪随机数生成器(CSPRNG)生成Salt。

然后来解决你的问题,我假设ZEND和php之间的算法没有区别。因为zend是一个围绕核心php的框架,并使用它。

要验证密码,crypt检查工作的方式是

crypt($password, $stored_hash) == $stored_hash;

在您首先进行哈希处理后存储哈希值时,将很容易通过此进行验证。

这就是实际发生的情况,如果你将散列作为第二个参数传递给函数blowfish,它将以bool值返回验证,无论盐是什么。

if (substr($storedpass, 0, 60) == crypt($password, "$2y$08$".substr($storedpass, 60))) { 
    return true; 
}  else { 
    return false; 
}

有关散列和安全性的信息,请阅读this

希望这有帮助