跳到內容

雜湊

簡介

Laravel 的 Hash facade 提供了安全的 Bcrypt 和 Argon2 雜湊功能,用於儲存使用者密碼。如果您正在使用 Laravel 應用程式入門套件 之一,預設情況下將使用 Bcrypt 進行註冊和身份驗證。

Bcrypt 是雜湊密碼的絕佳選擇,因為它的「工作因子」是可調整的,這表示隨著硬體效能的提升,產生雜湊值所需的時間可以增加。當雜湊密碼時,速度慢是好的。演算法雜湊密碼所需的時間越長,惡意使用者產生所有可能的字串雜湊值的「彩虹表」所需的時間就越長,這些彩虹表可能用於針對應用程式的暴力破解攻擊。

設定

預設情況下,Laravel 在雜湊資料時使用 bcrypt 雜湊驅動程式。但是,也支援其他幾種雜湊驅動程式,包括 argonargon2id

您可以使用 HASH_DRIVER 環境變數指定應用程式的雜湊驅動程式。但是,如果您想要自訂 Laravel 的所有雜湊驅動程式選項,您應該使用 config:publish Artisan 命令發佈完整的 hashing 設定檔

1php artisan config:publish hashing

基本用法

雜湊密碼

您可以透過呼叫 Hash facade 上的 make 方法來雜湊密碼

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 方法允許您使用 memorytimethreads 選項管理演算法的工作因子;但是,Laravel 管理的預設值對於大多數應用程式來說是可以接受的

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

有關這些選項的更多資訊,請參閱 關於 Argon 雜湊的官方 PHP 文件

驗證密碼是否與雜湊值相符

Hash facade 提供的 check 方法允許您驗證給定的純文字字串是否對應於給定的雜湊值

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

判斷密碼是否需要重新雜湊

Hash facade 提供的 needsRehash 方法允許您判斷自密碼雜湊以來,雜湊器使用的工作因子是否已變更。某些應用程式選擇在應用程式的身份驗證過程中執行此檢查

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

雜湊演算法驗證

為了防止雜湊演算法操縱,Laravel 的 Hash::check 方法將首先驗證給定的雜湊值是否是使用應用程式選定的雜湊演算法產生的。如果演算法不同,將會拋出 RuntimeException 例外。

對於大多數應用程式來說,這是預期的行為,在這些應用程式中,雜湊演算法預計不會變更,不同的演算法可能表示惡意攻擊。但是,如果您需要在應用程式中支援多種雜湊演算法,例如從一種演算法遷移到另一種演算法時,您可以透過將 HASH_VERIFY 環境變數設定為 false 來停用雜湊演算法驗證

1HASH_VERIFY=false