ハッシング
はじめに
LaravelのHash
ファサード は、ユーザーパスワードを安全に保存するためのBcryptとArgon2ハッシングを提供します。もしLaravelアプリケーションスターターキットのいずれかを使用している場合、Bcryptがデフォルトで登録および認証に使用されます。
Bcryptはパスワードをハッシュ化するための優れた選択肢です。その"work factor"は調整可能であり、ハッシュを生成するのにかかる時間をハードウェアのパワーが増加するにつれて増やすことができます。パスワードをハッシュ化する際には、遅い方が良いです。アルゴリズムがパスワードをハッシュ化するのにかかる時間が長いほど、悪意のあるユーザーがアプリケーションへの総当たり攻撃に使用する可能性のあるすべての文字列ハッシュ値の"レインボーテーブル"を生成するのにかかる時間も長くなります。
構成
デフォルトでは、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
例外がスローされます。
これは、ハッシングアルゴリズムが変更されないことが期待されるほとんどのアプリケーションにとって期待される動作です。異なるアルゴリズムは悪意のある攻撃の兆候となり得るためです。ただし、アプリケーション内で複数のハッシングアルゴリズムをサポートする必要がある場合、例えば、1つのアルゴリズムから別のアルゴリズムに移行する場合、HASH_VERIFY
環境変数をfalse
に設定することでハッシュアルゴリズムの検証を無効にすることができます。
HASH_VERIFY=false