ハッシュ
イントロダクション
LaravelのHash ファサードは、ユーザーパスワードを保存するための安全なBcryptおよびArgon2ハッシュを提供します。Laravelアプリケーションスターターキットのいずれかを使用している場合、デフォルトで登録と認証にBcryptが使用されます。
Bcryptは、「ワークファクタ」が調整可能であるため、パスワードのハッシュ化に適した選択肢です。つまり、ハードウェアの能力が向上するにつれて、ハッシュを生成するのにかかる時間を長くできます。パスワードをハッシュ化する場合、遅いことは良いことです。アルゴリズムがパスワードをハッシュ化するのに時間がかかるほど、悪意のあるユーザーが、アプリケーションに対するブルートフォース攻撃で使用される可能性のある、すべての文字列ハッシュ値の「レインボーテーブル」を生成するのに時間がかかります。
設定
デフォルトで、Laravelはデータをハッシュ化する際にbcryptハッシュドライバを使用します。しかし、argonやargon2idを含む、他のいくつかのハッシュドライバもサポートしています。
HASH_DRIVER環境変数を使用して、アプリケーションのハッシュドライバを指定できます。しかし、Laravelのすべてのハッシュドライバオプションをカスタマイズしたい場合は、config:publish Artisanコマンドを使用して完全なhashing設定ファイルを公開する必要があります。
1php artisan config:publish hashing
基本的な使い方
パスワードのハッシュ化
Hashファサードの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 Controller10{11 /**12 * Update the password for the user.13 */14 public function update(Request $request): RedirectResponse15 {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メソッドのmemory、time、threadsオプションを使用してアルゴリズムのワークファクタを管理できます。ただし、Laravelが管理するデフォルト値は、ほとんどのアプリケーションで許容範囲です。
1$hashed = Hash::make('password', [2 'memory' => 1024,3 'time' => 2,4 'threads' => 2,5]);
これらのオプションに関するより詳しい情報は、Argonハッシュに関する公式PHPドキュメントを参照してください。
パスワードがハッシュに一致するかの確認
Hashファサードが提供するcheckメソッドを使用すると、指定した平文の文字列が特定のハッシュに対応するかどうかを確認できます。
1if (Hash::check('plain-text', $hashedPassword)) {2 // The passwords match...3}
パスワードの再ハッシュが必要かの判断
Hashファサードが提供するneedsRehashメソッドを使用すると、パスワードがハッシュ化された後に、ハッシュ化に使用されたワークファクタが変更されたかどうかを判断できます。一部のアプリケーションでは、アプリケーションの認証プロセス中にこのチェックを実行することを選択します。
1if (Hash::needsRehash($hashed)) {2 $hashed = Hash::make('plain-text');3}
ハッシュアルゴリズムの検証
ハッシュアルゴリズムの操作を防ぐため、LaravelのHash::checkメソッドは、まず指定されたハッシュがアプリケーションで選択されたハッシュアルゴリズムを使用して生成されたものかどうかを検証します。アルゴリズムが異なる場合は、RuntimeException例外が投げられます。
これは、ハッシュアルゴリズムの変更が想定されておらず、異なるアルゴリズムが悪意のある攻撃の兆候となり得る、ほとんどのアプリケーションで期待される動作です。ただし、あるアルゴリズムから別のアルゴリズムに移行する場合など、アプリケーション内で複数のハッシュアルゴリズムをサポートする必要がある場合は、HASH_VERIFY環境変数をfalseに設定することで、ハッシュアルゴリズムの検証を無効にできます。
1HASH_VERIFY=false