雜湊
簡介
Laravel 的 Hash
facade 為儲存使用者密碼提供了安全的 Bcrypt 和 Argon2 雜湊。如果您使用 Laravel 應用程式入門套件之一,預設會使用 Bcrypt 進行註冊和認證。
Bcrypt 是雜湊密碼的絕佳選擇,因為它的「工作因子」可調整,這表示產生雜湊值所需的時間可以隨著硬體效能的提升而增加。在雜湊密碼時,慢是好的。演算法雜湊密碼所需時間越長,惡意使用者產生所有可能的字串雜湊值「彩虹表」所需時間就越長,這些彩虹表可能用於對應用程式進行暴力破解攻擊。
設定
預設情況下,Laravel 在雜湊資料時使用 bcrypt
雜湊驅動程式。不過,也支援其他幾種雜湊驅動程式,包括 argon
和 argon2id
。
您可以使用 HASH_DRIVER
環境變數指定應用程式的雜湊驅動程式。但是,如果您想自訂 Laravel 的所有雜湊驅動程式選項,則應使用 config:publish
Artisan 命令發佈完整的 hashing
設定檔:
php artisan config:publish hashing
基本使用
雜湊密碼
您可以透過呼叫 Hash
facade 上的 make
方法來雜湊密碼:
<?php
namespace App\Http\Controllers;
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,
]);
📌 備註
有關這些選項的更多資訊,請參閱 關於 Argon 雜湊的官方 PHP 文件。
驗證密碼是否符合雜湊值
Hash
facade 提供的 check
方法允許您驗證給定的純文字字串是否與給定的雜湊值相符:
if (Hash::check('plain-text', $hashedPassword)) {
// The passwords match...
}
判斷密碼是否需要重新雜湊
Hash
facade 提供的 needsRehash
方法允許您判斷自密碼被雜湊以來,雜湊器使用的「工作因子」是否已變更。有些應用程式選擇在應用程式的認證過程中執行此檢查:
if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('plain-text');
}
雜湊演算法驗證
為防止雜湊演算法操作,Laravel 的 Hash::check
方法會首先驗證給定的雜湊值是否使用應用程式選定的雜湊演算法產生。如果演算法不同,將會拋出 RuntimeException
例外。
這對於大多數應用程式來說是預期的行為,因為雜湊演算法預計不會改變,而不同的演算法可能預示著惡意攻擊。但是,如果您需要在應用程式中支援多個雜湊演算法,例如從一個演算法遷移到另一個演算法時,您可以透過將 HASH_VERIFY
環境變數設定為 false
來禁用雜湊演算法驗證:
HASH_VERIFY=false