ハッシング
はじめに
LaravelのHash
ファサードは、ユーザーパスワードを保存するための安全なBcryptおよびArgon2ハッシングを提供します。Laravelアプリケーションスターターキットのいずれかを使用している場合、デフォルトで登録と認証にBcryptが使用されます。
Bcryptはパスワードのハッシュ化に最適な選択肢です。なぜなら、その「ワークファクター」は調整可能であるため、ハッシュの生成にかかる時間をハードウェアの能力の向上に合わせて増やすことができるからです。パスワードをハッシュ化する際には、遅い方が良いです。アルゴリズムがパスワードをハッシュするのに時間がかかるほど、悪意のあるユーザーがアプリケーションに対するブルートフォース攻撃で使用される可能性のあるすべての文字列ハッシュ値の「レインボーテーブル」を生成するのに時間がかかります。
設定
デフォルトでは、Laravelはデータをハッシュ化する際にbcrypt
ハッシュドライバーを使用します。ただし、argon
やargon2id
など、他にもいくつかのハッシュドライバーがサポートされています。
HASH_DRIVER
環境変数を使用して、アプリケーションのハッシュドライバーを指定できます。ただし、Laravelのすべてのハッシュドライバーオプションをカスタマイズする場合は、config:publish
Artisanコマンドを使用して、完全なhashing
設定ファイルを公開する必要があります。
php artisan config:publish hashing
基本的な使い方
パスワードのハッシュ化
Hash
ファサードの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
ファサードによって提供されるcheck
メソッドを使用すると、指定されたプレーンテキスト文字列が指定されたハッシュに対応していることを確認できます。
if (Hash::check('plain-text', $hashedPassword)) { // The passwords match...}
パスワードの再ハッシュが必要かどうかの判断
Hash
ファサードによって提供されるneedsRehash
メソッドを使用すると、ハッシャーによって使用されるワークファクターがパスワードのハッシュ化 이후 변경되었かどうかを判断できます。一部のアプリケーションでは、アプリケーションの認証プロセス中にこのチェックを実行することを選択しています。
if (Hash::needsRehash($hashed)) { $hashed = Hash::make('plain-text');}
ハッシュアルゴリズムの検証
ハッシュアルゴリズムの操作を防ぐため、Laravelの`Hash::check`メソッドは、最初に指定されたハッシュがアプリケーションで選択されたハッシュアルゴリズムを使用して生成されたことを確認します。アルゴリズムが異なる場合、`RuntimeException`例外がスローされます。
これは、ハッシュアルゴリズムが変更されることが想定されておらず、異なるアルゴリズムが悪意のある攻撃の兆候となる可能性があるほとんどのアプリケーションで想定される動作です。ただし、あるアルゴリズムから別のアルゴリズムに移行する場合など、アプリケーション内で複数のハッシュアルゴリズムをサポートする必要がある場合は、`HASH_VERIFY`環境変数を`false`に設定することで、ハッシュアルゴリズムの検証を無効にできます。
HASH_VERIFY=false