Skip to content

ハッシュ化

イントロダクション

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
{
    /**
     * ユーザーのパスワードを更新する。
     */
    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メソッドでmemorytimethreadsオプションを使用してアルゴリズムの作業係数を管理できます。ただし、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');
}

ハッシュアルゴリズムの検証

ハッシュアルゴリズムの操作を防ぐために、LaravelのHash::checkメソッドは最初に指定されたハッシュがアプリケーションの選択されたハッシュアルゴリズムを使用して生成されたかどうかを検証します。アルゴリズムが異なる場合、RuntimeException例外がスローされます。

これは、ハッシュアルゴリズムが変更されることを期待していないほとんどのアプリケーションにとって期待される動作であり、異なるアルゴリズムは悪意のある攻撃の兆候である可能性があります。ただし、アプリケーション内で複数のハッシュアルゴリズムをサポートする必要がある場合、例えばあるアルゴリズムから別のアルゴリズムに移行する場合など、HASH_VERIFY環境変数をfalseに設定することでハッシュアルゴリズムの検証を無効にできます。

HASH_VERIFY=false

ユーザーノート