哈希

简介

Laravel 的 Hash Facade 提供了安全的 Bcrypt 和 Argon2 哈希,用于存储用户密码。如果使用 Laravel 应用内置的 LoginControllerRegisterController 类,默认情况下它们会使用 Bcrypt 进行注册和身份认证。

Bcrypt 是哈希密码的绝佳选择,因为它的「加密系数」是可调整的,这意味着随着硬件功率的增加,生成哈希所需的时间也会增加。

配置

应用哈希驱动默认在 config/hashing.php 文件中配置。目前有三种支持的驱动:BcryptArgon2 (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 方法允许您使用 memorytimethreads 选项来管理算法的加密系数;不过,默认的加密系数对大多数应用来说都能接受的:

$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');
}