#はじめに
Laravel の Hash ファサード は、ユーザーのパスワードを安全に保存するための Bcrypt と Argon2 のハッシュ化を提供します。もし Laravel アプリケーションのスターターキット を使用している場合、登録と認証にはデフォルトで Bcrypt が使われます。
Bcrypt はパスワードのハッシュ化に適した選択肢です。なぜなら「ワークファクター」を調整できるため、ハッシュ生成にかかる時間をハードウェアの性能向上に合わせて増やせるからです。パスワードのハッシュ化は遅いほど良いです。アルゴリズムがパスワードのハッシュ化に時間をかけるほど、悪意あるユーザーがブルートフォース攻撃に使う可能性のある全ての文字列のハッシュ値をまとめた「レインボーテーブル」を作成するのに時間がかかります。
#設定
アプリケーションのデフォルトのハッシュドライバーは、config/hashing.php 設定ファイルで指定します。現在サポートされているドライバーには、Bcrypt と Argon2(Argon2i と Argon2id のバリアント)があります。
#基本的な使い方
#パスワードのハッシュ化
Hash ファサードの make メソッドを呼び出すことで、パスワードをハッシュ化できます。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class PasswordController extends Controller
{
/**
* ユーザーのパスワードを更新します。
*/
public function update(Request $request): RedirectResponse
{
// 新しいパスワードの長さを検証...
$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,
]);
これらのオプションの詳細は、公式 PHP ドキュメントの Argon ハッシュに関するページをご参照ください。
#パスワードがハッシュと一致するかの検証
Hash ファサードの check メソッドを使うと、指定したプレーンテキストの文字列がハッシュと一致するか検証できます。
if (Hash::check('plain-text', $hashedPassword)) {
// パスワードが一致します...
}
#パスワードの再ハッシュが必要かの判定
Hash ファサードの needsRehash メソッドを使うと、パスワードがハッシュ化された後にワークファクターが変更されたかどうかを判定できます。アプリケーションによっては認証処理の際にこのチェックを行います。
if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('plain-text');
}