Hashing
Introduction
LaravelHash
facade 提供安全的 Bcrypt 和 Argon2 哈希来存储用户密码。如果您使用其中之一Laravel 应用程序入门套件,默认会使用Bcrypt进行注册和认证。
Bcrypt 是散列密码的绝佳选择,因为它的“工作因数”是可调的,这意味着生成散列所需的时间可以随着硬件功率的增加而增加。散列密码时,慢是好的。算法对密码进行散列处理的时间越长,恶意用户生成所有可能的字符串散列值的“彩虹表”所需的时间就越长,这些散列值可能用于对应用程序进行暴力攻击。
Configuration
您的应用程序的默认哈希驱动程序在您的应用程序的config/hashing.php
配置文件。目前有几个受支持的驱动程序:Bcrypt 和Argon2 (Argon2i 和 Argon2id 变体)。
基本用法
散列密码
您可以通过调用make
上的方法Hash
正面:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class PasswordController extends Controller
{
/**
* Update the password for the user.
*/
public function update(Request $request): RedirectResponse
{
// Validate the new password length...
$request->user()->fill([
'password' => Hash::make($request->newPassword)
])->save();
return redirect('/profile');
}
}
调整 Bcrypt 工作因数
如果您使用的是 Bcrypt 算法,则make
方法允许您使用rounds
选项;然而,Laravel 管理的默认工作因素对于大多数应用程序来说是可以接受的:
$hashed = Hash::make('password', [
'rounds' => 12,
]);
调整 Argon2 功因数
如果您使用的是 Argon2 算法,则make
方法允许您使用memory
,time
, 和threads
选项;但是,大多数应用程序都可以接受 Laravel 管理的默认值:
$hashed = Hash::make('password', [
'memory' => 1024,
'time' => 2,
'threads' => 2,
]);
Note
有关这些选项的更多信息,请参阅关于 Argon 哈希的官方 PHP 文档.
验证密码是否与哈希匹配
这check
提供的方法Hash
facade 允许您验证给定的纯文本字符串是否对应于给定的哈希值:
if (Hash::check('plain-text', $hashedPassword)) {
// The passwords match...
}
确定密码是否需要重新哈希
这needsRehash
提供的方法Hash
facade 允许您确定自密码被散列后散列器使用的工作因子是否发生了变化。一些应用程序选择在应用程序的身份验证过程中执行此检查:
if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('plain-text');
}