イントロダクション
LaravelのHash
ファサードは、ユーザーパスワードを保存するための安全なBcryptおよびArgon2ハッシュを提供します。Laravelアプリケーションスターターキットのいずれかを使用している場合、デフォルトで登録と認証にBcryptが使用されます。
Bcryptは、その「作業係数」が調整可能であるため、パスワードのハッシュに最適です。つまり、ハードウェアの能力が上がると、ハッシュの生成にかかる時間が長くなる可能性があります。パスワードをハッシュする場合は、遅いのが利点です。アルゴリズムがパスワードをハッシュするのに時間がかかるほど、悪意のあるユーザーがアプリケーションに対するブルートフォース攻撃で使用される可能性のあるすべての文字列ハッシュ値の「レインボーテーブル」を生成するのにかかる時間が長くなります。
設定
アプリケーションのデフォルトのハッシュドライバは、アプリケーションのconfig/hashing.php
設定ファイルで設定されます。現在サポートしているドライバはいくつかあります:BcryptおよびArgon2(Argon2iおよびArgon2idバリアント)です。
基本的な使用法
パスワードのハッシュ
Hash
ファサードでmake
メソッドを呼び出すことにより、パスワードをハッシュすることができます。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class PasswordController extends Controller
{
/**
* ユーザーのパスワードを更新
*/
public function update(Request $request): RedirectResponse
{
// 新しいパスワードの長さをバリデート…
$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,
]);
Note: これらのオプションの詳細には、Argonハッシュに関するPHP公式ドキュメントを参照してください。
パスワードがハッシュと一致するかの確認
Hash
ファサードが提供するcheck
メソッドを使用すると、指定するプレーンテキスト文字列が指定するハッシュに対応することを確認できます。
if (Hash::check('plain-text', $hashedPassword)) {
// パスワードが一致
}
パスワードを再ハッシュする必要があるかの判断
Hash
ファサードが提供するneedsRehash
メソッドを使用すると、パスワードがハッシュされてから、ハッシャーによって使用される作業要素が変更されたかどうかを判別できます。一部のアプリケーションは、アプリケーションの認証プロセス中にこのチェックを実行することを選択しています。
if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('plain-text');
}