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