メインコンテンツまでスキップ

ハッシング

はじめに

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

Bcryptはパスワードをハッシュ化するための優れた選択肢です。その"work factor"は調整可能であり、ハッシュを生成するのにかかる時間をハードウェアのパワーが増加するにつれて増やすことができます。パスワードをハッシュ化する際には、遅い方が良いです。アルゴリズムがパスワードをハッシュ化するのにかかる時間が長いほど、悪意のあるユーザーがアプリケーションへの総当たり攻撃に使用する可能性のあるすべての文字列ハッシュ値の"レインボーテーブル"を生成するのにかかる時間も長くなります。

構成

デフォルトでは、Laravelはデータをハッシュ化する際にbcryptハッシュドライバを使用します。ただし、argonargon2id を含む他の複数のハッシュドライバがサポートされています。

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メソッドを使用してアルゴリズムの作業ファクターをmemorytimethreadsオプションを使用して管理することができます。ただし、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