Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 4.1哈希::使不一致_Php_Login_Hash_Laravel 4 - Fatal编程技术网

Php Laravel 4.1哈希::使不一致

Php Laravel 4.1哈希::使不一致,php,login,hash,laravel-4,Php,Login,Hash,Laravel 4,我试图将数据库中的哈希密码与登录表单中的哈希密码进行匹配,但无论如何都不匹配 然后我做了一些一致性测试 $password = Hash::make('secret'); echo $password; 每次刷新页面时,我都会得到不同的结果。不像md5,它是一致的 我错过什么了吗 还是我用错了/做错了 为什么Hash::make使用相同的参数生成不一致的结果?这是正确的,这是出于设计 好的,该函数使用php函数,默认为PASSWORD_BCRYPT标志 密码\u BCRYPT-使用CRYPT\

我试图将数据库中的哈希密码与登录表单中的哈希密码进行匹配,但无论如何都不匹配

然后我做了一些一致性测试

$password = Hash::make('secret');
echo $password;
每次刷新页面时,我都会得到不同的结果。不像md5,它是一致的

我错过什么了吗

还是我用错了/做错了


为什么Hash::make使用相同的参数生成不一致的结果?

这是正确的,这是出于设计

好的,该函数使用php函数,默认为PASSWORD_BCRYPT标志

密码\u BCRYPT-使用CRYPT\u BLOWFISH算法创建 搞砸这将使用 “$2y$”标识符。结果将始终是一个60个字符的字符串,或 失败是错误的

这意味着每次调用时都会自动生成salt,并将其插入生成的字符串中,该字符串包含:algo的标识符(在本例中为
$2y$
)、迭代成本(默认为12)、哈希密码和生成的随机salt

因此,这意味着,每次对密码进行哈希运算时,都会创建一个新的salt,因此字符串总是不同的——即使密码相同。这是不含盐的简单md5哈希的优点之一

要检查它,可以使用Hash::check(),它使用password\u verify()php函数,该函数分析散列,猜测使用的算法,获取嵌入的salt,因此可以检查在给定相同的启动条件下,该过程是否创建了相同的散列

编辑

事实上,这就是方法(在
照亮/Hashing/BcryptHasher
中)


嗯,好消息。那么,如何在sql级别比较哈希密码呢?我看到的唯一解决方案是获取密码(查询),然后使用Hash::check。。。要获取密码,必须找到与用户名匹配的记录。但我希望在我的查询中使用两列搜索/匹配。我认为在DB级别上无法做到这一点,否则这将非常困难,通常是在处理级别上完成的,我认为没有理由避免这种情况
 * 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;
}
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);