はじめに

Laravel Hash ファサード は、ユーザーパスワードを保存するための安全な Bcrypt および Argon2 ハッシュ化を提供します。 Laravel アプリケーションスターターキット のいずれかを使用している場合、デフォルトで登録と認証には Bcrypt が使用されます。

Bcrypt は、ハッシュ化の「作業係数」を調整可能であるため、パスワードのハッシュ化に最適な選択肢です。これは、ハッシュを生成するのにかかる時間をハードウェアの性能が向上するにつれて増加させることができることを意味します。パスワードをハッシュ化する際には、遅い方が良いのです。アルゴリズムがパスワードをハッシュ化するのに時間がかかるほど、悪意のあるユーザーがアプリケーションに対するブルートフォース攻撃で使用される可能性のあるすべての文字列ハッシュ値の「レインボーテーブル」を生成するのにかかる時間が長くなります。

設定

デフォルトでは、Laravel はデータをハッシュ化する際に bcrypt ハッシングドライバーを使用します。ただし、argonargon2id など、他のいくつかのハッシングドライバーもサポートされています。

アプリケーションのハッシングドライバーを HASH_DRIVER 環境変数を使用して指定できます。ただし、Laravel のすべてのハッシングドライバーオプションをカスタマイズしたい場合は、config:publish Artisan コマンドを使用して完全な hashing 設定ファイルを公開する必要があります:

  1. php artisan config:publish hashing

基本的な使用法

パスワードのハッシュ化

パスワードは、Hash ファサードの make メソッドを呼び出すことでハッシュ化できます:

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\RedirectResponse;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Support\Facades\Hash;
  6. class PasswordController extends Controller
  7. {
  8. /**
  9. * Update the password for the user.
  10. */
  11. public function update(Request $request): RedirectResponse
  12. {
  13. // Validate the new password length...
  14. $request->user()->fill([
  15. 'password' => Hash::make($request->newPassword)
  16. ])->save();
  17. return redirect('/profile');
  18. }
  19. }

Bcrypt 作業係数の調整

Bcrypt アルゴリズムを使用している場合、make メソッドを使用してアルゴリズムの作業係数を rounds オプションで管理できます。ただし、Laravel によって管理されるデフォルトの作業係数は、ほとんどのアプリケーションにとって受け入れ可能です:

  1. $hashed = Hash::make('password', [
  2. 'rounds' => 12,
  3. ]);

Argon2 作業係数の調整

Argon2 アルゴリズムを使用している場合、make メソッドを使用してアルゴリズムの作業係数を memorytime、および threads オプションで管理できます。ただし、Laravel によって管理されるデフォルト値は、ほとんどのアプリケーションにとって受け入れ可能です:

  1. $hashed = Hash::make('password', [
  2. 'memory' => 1024,
  3. 'time' => 2,
  4. 'threads' => 2,
  5. ]);

これらのオプションに関する詳細は、Argon ハッシングに関する公式 PHP ドキュメント を参照してください。

パスワードがハッシュと一致するかの検証

Hash ファサードによって提供される check メソッドを使用すると、指定されたプレーンテキスト文字列が指定されたハッシュに対応しているかどうかを検証できます:

  1. if (Hash::check('plain-text', $hashedPassword)) {
  2. // The passwords match...
  3. }

パスワードを再ハッシュ化する必要があるかの判断

Hash ファサードによって提供される needsRehash メソッドを使用すると、ハッシャーによって使用された作業係数がパスワードがハッシュ化されて以来変更されたかどうかを判断できます。一部のアプリケーションは、アプリケーションの認証プロセス中にこのチェックを実行することを選択します:

  1. if (Hash::needsRehash($hashed)) {
  2. $hashed = Hash::make('plain-text');
  3. }

ハッシュアルゴリズムの検証

ハッシュアルゴリズムの操作を防ぐために、Laravel の Hash::check メソッドは、最初に指定されたハッシュがアプリケーションの選択したハッシングアルゴリズムを使用して生成されたことを確認します。アルゴリズムが異なる場合、RuntimeException 例外がスローされます。

これは、ハッシングアルゴリズムが変更されることが期待されないほとんどのアプリケーションにとって期待される動作であり、異なるアルゴリズムは悪意のある攻撃の兆候である可能性があります。ただし、アプリケーション内で複数のハッシングアルゴリズムをサポートする必要がある場合、たとえば、あるアルゴリズムから別のアルゴリズムに移行する場合は、HASH_VERIFY 環境変数を false に設定することでハッシュアルゴリズムの検証を無効にできます:

  1. HASH_VERIFY=false