跳至内容

哈希

介绍

LaravelHash 门面提供了安全的 Bcrypt 和 Argon2 哈希算法来存储用户密码。如果您正在使用Laravel 应用程序入门套件之一,则默认将使用 Bcrypt 进行注册和身份验证。

Bcrypt 是哈希密码的绝佳选择,因为它的“工作因子”是可调的,这意味着生成哈希值所需的时间可以随着硬件性能的提升而增加。在哈希密码时,慢是好事。算法哈希密码所需的时间越长,恶意用户生成包含所有可能用于暴力破解应用程序的字符串哈希值的“彩虹表”所需的时间就越长。

配置

默认情况下,Laravel 使用bcrypthashing 驱动程序来对数据进行哈希处理。不过,Laravel 还支持其他几个哈希驱动程序,包括argonargon2id

你可以使用环境变量指定应用程序的哈希驱动程序HASH_DRIVER。但是,如果你想自定义 Laravel 的所有哈希驱动程序选项,则应hashing使用config:publishArtisan 命令发布完整的配置文件:

1php artisan config:publish hashing

基本用法

哈希密码

make您可以通过调用外观上的方法来散列密码Hash

1<?php
2 
3namespace App\Http\Controllers;
4 
5use Illuminate\Http\RedirectResponse;
6use Illuminate\Http\Request;
7use Illuminate\Support\Facades\Hash;
8 
9class PasswordController extends Controller
10{
11 /**
12 * Update the password for the user.
13 */
14 public function update(Request $request): RedirectResponse
15 {
16 // Validate the new password length...
17 
18 $request->user()->fill([
19 'password' => Hash::make($request->newPassword)
20 ])->save();
21 
22 return redirect('/profile');
23 }
24}

调整 Bcrypt 工作因子

如果您使用的是 Bcrypt 算法,则该make方法允许您使用选项管理算法的工作因子rounds;但是,Laravel 管理的默认工作因子对于大多数应用程序来说是可以接受的:

1$hashed = Hash::make('password', [
2 'rounds' => 12,
3]);

调整 Argon2 工作系数

如果您使用的是 Argon2 算法,该方法允许您使用和选项make管理算法的工作因子;但是,Laravel 管理的默认值对于大多数应用程序来说是可以接受的:memorytimethreads

1$hashed = Hash::make('password', [
2 'memory' => 1024,
3 'time' => 2,
4 'threads' => 2,
5]);

有关这些选项的更多信息,请参阅有关 Argon 哈希的官方 PHP 文档

验证密码是否与哈希值匹配

check外观提供的方法允许Hash您验证给定的纯文本字符串是否对应于给定的哈希:

1if (Hash::check('plain-text', $hashedPassword)) {
2 // The passwords match...
3}

确定密码是否需要重新哈希

needsRehashFacade提供的方法允许Hash您确定哈希器使用的工作因子是否自密码哈希处理后发生了变化。某些应用程序选择在应用程序的身份验证过程中执行此检查:

1if (Hash::needsRehash($hashed)) {
2 $hashed = Hash::make('plain-text');
3}

哈希算法验证

为了防止哈希算法被篡改,Laravel 的Hash::check方法会首先验证给定的哈希值是否是使用应用程序所选的哈希算法生成的。如果算法不同,RuntimeException则会抛出异常。

对于大多数应用程序来说,这是预期的行为,因为哈希算法通常不会改变,而不同的算法可能表示存在恶意攻击。但是,如果您需要在应用程序中支持多种哈希算法(例如从一种算法迁移到另一种算法时),则可以通过将HASH_VERIFY环境变量设置为 来禁用哈希算法验证false

1HASH_VERIFY=false