我试图将数据库中的散列密码与登录表单中的密码哈希进行匹配,但无论如何都不匹配。
然后我做了一些一致性测试。
$password = Hash::make('secret');
echo $password;每次刷新页面都会得到不同的结果。不像md5,它是一致的。
我是不是遗漏了什么?
还是我用错了?
为什么哈希::使产生不一致的结果与相同的args?
发布于 2014-02-13 06:25:47
这是正确的,这是故意的。
,该函数使用散列() php函数,默认为PASSWORD_BCRYPT标志,该标志
PASSWORD_BCRYPT --使用CRYPT_BLOWFISH算法创建哈希。这将使用"$2y$“标识符生成一个标准的crypt()兼容散列。结果总是一个60个字符串,或者失败时为FALSE。
这意味着每个调用都会自动生成一个salt,并将其插入到生成的字符串中,该字符串包含: algo的标识符(在本例中为$2y$)、迭代成本(默认值为12)、散列密码和生成的随机盐。
因此,这意味着每次您散列密码时都会创建一个新的salt,因此字符串总是不同的--即使密码是相同的。这是没有salt的简单md5散列的优点之一。
要检查它,您可以使用Hash:: check (),它使用password_verify() php函数,该函数分析哈希,猜测使用的algo,接受嵌入的盐分,因此可以检查该过程在相同的启动条件下是否会创建相同的哈希。
编辑
实际上,这就是方法(在Illuminate/Hashing/BcryptHasher中)
* Hash the given value.
*
* @param string $value
* @param array $options
* @return string
*/
public function make($value, array $options = array())
{
$cost = isset($options['rounds']) ? $options['rounds'] : $this->rounds;
$hash = password_hash($value, PASSWORD_BCRYPT, array('cost' => $cost));
if ($hash === false)
{
throw new \RuntimeException("Bcrypt hashing not supported.");
}
return $hash;
}发布于 2014-08-02 10:15:42
Validator::extend('old_password', function($attribute, $value, $parameters) {
return Hash::check($value, Auth::user()->password);
});
$rules = array(
'old_password' => 'required|old_password',
'new_password' => 'required|confirmed'
);
$messages = array(
'old_password' => 'wrong old password'
);
$validator = Validator::make($data = $input, $rules, $messages);https://stackoverflow.com/questions/21746531
复制相似问题