为什么的crypt()产生不同的结果?(Why is crypt() generating diff

2019-09-21 06:16发布

隐窝正在产生不同的散列以相同的输入数据,并且将[以下]先前官能散列发生器/检查不再工作用于认证用户:

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; 
     }
}

我敲我的头靠在墙上,已经发现了与PHP VS操作系统的算法Zend的内部算法之间的差异没有答案; 或PHP之间的差异5.3.8 VS早...

编辑:我的问题是技术上的回答,这是我的错,我没有正确问。 我实现了:

$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。

Answer 1:

因为要创建的salt与随机数的帮助下,

函数mt_rand()将创建随机数,每次当你调用,任选最小值,最大值参数的时间。 通常功能强大的加密密码哈希,盐应该使用密码安全伪随机数发生器(CSPRNG)产生。

然后来到你的问题,我认为还会有Zend和PHP之间的算法没有差别。 因为Zend公司是围绕核心PHP框架包裹,并利用它。

为了验证密码,该怎么crypt检查工作

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

一旦你储存当你第一次哈希散列值,它会很容易通过这个来验证。

这就是实际发生在这里,如果你通过哈希作为第二个参数的功能河豚,它会通过一个布尔值返回验证,不管盐。

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

你对散列和安全信息,请阅读本

希望这可以帮助



文章来源: Why is crypt() generating different results?