哈希
简介
Laravel 的 Hash
Facade 提供了安全的 Bcrypt 和 Argon2 哈希,用于存储用户密码。如果使用 Laravel 应用内置的 LoginController
和 RegisterController
类,默认情况下它们会使用 Bcrypt 进行注册和身份认证。
Bcrypt 是哈希密码的绝佳选择,因为它的「加密系数」是可调整的,这意味着随着硬件功率的增加,生成哈希所需的时间也会增加。
配置
应用哈希驱动默认在 config/hashing.php
文件中配置。目前有三种支持的驱动:Bcrypt 和 Argon2 (Argon2i 和 Argon2id 的变种)。
Argon2i 驱动要求 PHP 7.2.0 或更高版本,Argon2id 驱动要求 PHP 7.3.0 或更高版本。
基本使用
可以通过调用 Hash
Facade 的 make
方法来对密码进行哈希处理:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use App\Http\Controllers\Controller;
class UpdatePasswordController extends Controller
{
/**
* 更新用户密码
*
* @param Request $request
* @return Response
*/
public function update(Request $request)
{
// 验证新密码长度
$request->user()->fill([
'password' => Hash::make($request->newPassword)
])->save();
}
}
调整 Bcrypt 加密系数
如果使用 Bcrypt 算法,make
方法允许您使用 rounds
选项来管理算法的加密系数;不过,默认的加密系数对大多数应用来说都能接受的:
$hashed = Hash::make('password', [
'rounds' => 12
]);
调整 Argon2 加密系数
如果使用 Argon2 算法,make
方法允许您使用 memory
,time
和 threads
选项来管理算法的加密系数;不过,默认的加密系数对大多数应用来说都能接受的:
$hashed = Hash::make('password', [
'memory' => 1024,
'time' => 2,
'threads' => 2,
]);
有关这些选项的更多信息,可以查看 PHP 官方文档。
根据哈希值验证密码
check
可以验证给定的纯文本字符串是否和给定的哈希对应。不过,如果使用 Laravel 自带的 LoginController
,则不需要直接使用它,因为该控制器会自动调用此方法:
if (Hash::check('plain-text', $hashedPassword)) {
// 密码匹配
}
检查密码是否需要重新哈希
needsRehash
函数允许您判断自密码被哈希之后,哈希所使用的加密系数是否更改了:
if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('plain-text');
}