我试图将数据库中的哈希密码与密码进行匹配 - 从登录表单中进行哈希处理,无论如何都不匹配。
然后我做了一些一致性测试。
$password = Hash::make('secret');
echo $password;
每次刷新页面时,我都会得到不同的结果。不像md5,它是一致的。
我错过了什么吗?
或者我使用/做错了吗?
为什么Hash :: make会使用相同的args产生不一致的结果?
答案 0 :(得分:2)
这是正确的,这是设计的。
AFAIK,该函数使用password_hash() php函数,默认为PASSWORD_BCRYPT标志,
PASSWORD_BCRYPT - 使用CRYPT_BLOWFISH算法创建 哈希值。这将使用。生成标准的crypt()兼容哈希 “$ 2y $”标识符。结果将始终是60个字符的字符串,或 失败就错了。
这意味着每次调用都会自动生成一个salt,并在中插入生成的字符串,其中包含:算法的标识符(在本例中为$2y$
),迭代cost(默认为12),散列密码和生成的随机盐。
这意味着,因此,每次您对密码进行哈希处理时,都会创建一个新的盐,因此字符串将始终不同 - 即使密码相同。与没有盐的简单md5哈希相比,这是的一个优势。
要检查它,你使用Hash :: check(),它使用password_verify()php函数,它分析哈希,猜测算法使用,采取,嵌入盐,因此可以检查程序,给定相同的起始条件,创建一个相同的哈希。
修改强>
确实,这是方法(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;
}
答案 1 :(得分:0)
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);