我试图了解 Laravel 4.2 中 BcryptHasher.php 文件中的以下函数是如何工作的:
/**
* Hash the given value.
*
* @param string $value
* @param array $options
* @return string
*
* @throws \RuntimeException
*/
public function make($value, array $options = [])
{
$cost = isset($options['rounds']) ? $options['rounds'] : $this->rounds;
$hash = password_hash($value, PASSWORD_BCRYPT, ['cost' => $cost]);
if ($hash === false) {
throw new RuntimeException('Bcrypt hashing not supported.');
}
return $hash;
}
我想我什么都懂,除了这句话:
$cost = isset($options['rounds']) ? $options['rounds'] : $this->rounds;
我知道 $this->rounds 的默认值设置为 10,这就是密码哈希值的“成本”。但是,我对 $options 数组正在做什么以及这可能如何影响成本感到困惑?
调用
make
方法时可以传入选项。
例如,使用门面:
$hashed = Hash::make($value, ['rounds' => 8]);
如果你不传入
cost
,它将使用$this->rounds
,即10
。
在 laravel 5.5 及之前版本中,因为哈希轮数在这些版本中是硬编码的,所以没有办法,除非您构建一个外观或服务来根据您的需要处理默认的哈希轮数,然后使用包装类而不是原始的 Hash 类。
但是,从 Laravel 5.6 开始,默认的哈希轮数存储在
config/hashing.php
文件中,您可以使用本节或在 BCRYPT_ROUNDS
文件中设置 .env
环境变量将默认值更改为您想要的值。
/*
|--------------------------------------------------------------------------
| Bcrypt Options
|--------------------------------------------------------------------------
|
| Here you may specify the configuration options that should be used when
| passwords are hashed using the Bcrypt algorithm. This will allow you
| to control the amount of time it takes to hash the given password.
|
*/
'bcrypt' => [
'rounds' => env('BCRYPT_ROUNDS', 10),
],
作为对 adnan 答案的补充,在 laravel ^10 中,他们将默认的 bcrypt 轮次从 10 更改为 12(检查拉取请求)。 所以:
/*
|--------------------------------------------------------------------------
| Bcrypt Options
|--------------------------------------------------------------------------
|
| Here you may specify the configuration options that should be used when
| passwords are hashed using the Bcrypt algorithm. This will allow you
| to control the amount of time it takes to hash the given password.
|
*/
'bcrypt' => [
'rounds' => env('BCRYPT_ROUNDS', 12),
'verify' => true,
],