コンテンツにスキップ

ハッシング

はじめに

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

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

設定

デフォルトでは、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`メソッドでは`memory`、`time`、および`threads`オプションを使用してアルゴリズムのワークファクターを管理できます。ただし、Laravelによって管理されるデフォルト値は、ほとんどのアプリケーションで許容されます。

$hashed = Hash::make('password', [
'memory' => 1024,
'time' => 2,
'threads' => 2,
]);
lightbulb

これらのオプションの詳細については、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