雜湊
簡介
Laravel 的 Hash
Facade 提供了安全的 Bcrypt 與 Argon2 雜湊,用以儲存使用者密碼。若使用 Laravel 專案入門套件,則預設會使用 Bcrypt 來註冊與登入。
Bcrypt 是雜湊密碼的一個不錯的選擇,因為其「Work Factor」是可調整的,這表示,隨著硬體功能的提升,我們也能調整產生雜湊所需的時間。在雜湊密碼時,慢即是好。若演算法需要更多的時間來雜湊密碼,惡意使用者要產生「彩虹表」的時間也就更長。彩虹表是一個包含各種可能字串雜湊值的表格,可用來暴力破解密碼。
設定
專案中預設的雜湊 Driver 設定在專案的 config/hashing.php
設定檔中。目前有支援多個 Driver: Bcrypt 與 Argon2 (Argon2i 與 Argon2id 變形)。
基礎用法
雜湊密碼
可以呼叫 Hash
Facade 上的 make
方法來雜湊密碼:
1<?php23namespace App\Http\Controllers;45use App\Http\Controllers\Controller;6use Illuminate\Http\Request;7use Illuminate\Http\Response;8use Illuminate\Support\Facades\Hash;910class PasswordController extends Controller11{12 /**13 * Update the password for the user.14 */15 public function update(Request $request): Response16 {17 // 檢查新密碼的長度...1819 $request->user()->fill([20 'password' => Hash::make($request->newPassword)21 ])->save();2223 return response()->noContent();24 }25}
1<?php23namespace App\Http\Controllers;45use App\Http\Controllers\Controller;6use Illuminate\Http\Request;7use Illuminate\Http\Response;8use Illuminate\Support\Facades\Hash;910class PasswordController extends Controller11{12 /**13 * Update the password for the user.14 */15 public function update(Request $request): Response16 {17 // 檢查新密碼的長度...1819 $request->user()->fill([20 'password' => Hash::make($request->newPassword)21 ])->save();2223 return response()->noContent();24 }25}
調整 Bcrypt 的 Work Factor
若使用 Bcrypt 演算法,可使用 rounds
選項來在 make
方法中控制 Bcrypt 的 Work Factor。不過,Laravel 所控制的預設 Work Factor 對於大多數專案來說應是可接受的值:
1$hashed = Hash::make('password', [2 'rounds' => 12,3]);
1$hashed = Hash::make('password', [2 'rounds' => 12,3]);
調整 Argon2 的 Work Factor
若使用 Argon2 演算法,可使用 memory
、time
、threads
等選項來在 make
方法中控制 Argon2 演算法的 Work Factor。不過,Laravel 所控制的預設 Work Factor 對於大多數專案來說應是可接受的值:
1$hashed = Hash::make('password', [2 'memory' => 1024,3 'time' => 2,4 'threads' => 2,5]);
1$hashed = Hash::make('password', [2 'memory' => 1024,3 'time' => 2,4 'threads' => 2,5]);
有關這些選項的詳細資訊,請參考 PHP 官方說明文件中有關 Argon 雜湊的說明。
驗證密碼是否符合雜湊
Hash
Facade 的 check
方法可用來驗證給定的純文字字串是否對應給定的雜湊:
1if (Hash::check('plain-text', $hashedPassword)) {2 // 密碼正確...3}
1if (Hash::check('plain-text', $hashedPassword)) {2 // 密碼正確...3}
判斷密碼是否需要重新雜湊
Hash
Facade 的 needsRehash
方法可用來判斷自從該密碼被雜湊以來 Hash 程式的 Work Factor 是否有經過更改。有的專案會在網站的身份驗證過程中做這項檢查:
1if (Hash::needsRehash($hashed)) {2 $hashed = Hash::make('plain-text');3}
1if (Hash::needsRehash($hashed)) {2 $hashed = Hash::make('plain-text');3}