はじめに
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