Hashing
Table of Contents
Introduction
Laravel の Hash
facadeは、安全な Bcrypt と Argon2 hashing を提供し、userpassword の保存に使用します。もしあなたがLaravel アプリケーションのスターターキットのいずれかを使用している場合、Bcrypt は default として登録と authentication に使われます。
Bcrypt は、その work factor が調整可能であるため、 hashing passwords に最適な選択です。つまり、ハードウェアのパワーが増えるにつれて、 hash を生成する時間を増やすことができます。 hashing passwords の際には、遅い方が良いです。 algorithm が password を hash するのに時間がかかるほど、悪意のある users が全ての可能性のある string hash values の rainbow tables を生成するのに時間がかかります。これは、アプリケーションに対するブルートフォース攻撃に利用されるかもしれません。
Configuration
default で、Laravel は data をハッシュ化する際にbcrypt
ハッシュ化 drivers を使用します。しかし、他にもいくつかのハッシュ化 drivers がサポートされています。これにはargon
とargon2id
が含まれます。
あなたはHASH_DRIVER
の環境 variables を使用して、application のハッシュ化 driver を指定することができます。しかし、Laravel のすべてのハッシュ化 driveroption をカスタマイズしたい場合は、config:publish
の Artisan command を使用して、完全なhashing
設定ファイルを公開するべきです。
php artisan config:publish hashing
Basic Usage
Hashing Passwords
password を hash するには、Hash
facade のmake
method を呼び出すことができます:
<?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 の algorithm を使用している場合、make
の method を使用すると、rounds
オプションを使用して algorithm のワークファクタを管理できます。ただし、 Laravel が管理する default のワークファクタは、ほとんどのアプリケーションにとって十分です。
$hashed = Hash::make('password', [
'rounds' => 12,
]);
Argon2 ワークファクターの調整
あなたが Argon2 algorithm を使用している場合、make
method を使用して、memory
、time
、およびthreads
オプションを使用して algorithm の作業要因を管理できます。ただし、 Laravel によって管理される default values は、ほとんどのアプリケーションにとって適しています。
$hashed = Hash::make('password', [
'memory' => 1024,
'time' => 2,
'threads' => 2,
]);
NOTE
これらの options についての詳細は、公式 PHP ドキュメンテーションの Argon hashing に関する部分 をご参照ください。
Password が Hash と一致していることを確認する
Hash
facade によって提供されるcheck
method は、与えられた平文の string が与えられた hash に対応していることを確認することができます:
if (Hash::check('plain-text', $hashedPassword)) {
// The passwords match...
}
Password が再ハッシュ化する必要があるかどうかの判定
Hash
の facade によって提供されるneedsRehash
method は、ハッシャーが使用するワークファクターが、 password がハッシュ化された時点から変更されたかどうかを判断することを可能にします。一部の applications は、applications の authentication process 中にこのチェックを行うことを選択します:
if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('plain-text');
}
Hash Algorithm Verification
ハッシュアルゴリズムの操作を防ぐため、Laravel の Hash::check
method は、まず与えられたハッシュが application が選択したハッシュ化アルゴリズムを使用して生成されたものであることを検証します。もしアルゴリズムが異なる場合、RuntimeException
例外が throw されます。
これは、ほとんどのアプリケーションで予想される動作で、 hashing algorithm が変更されることが予期されておらず、異なるアルゴリズムは悪意のある攻撃の兆候である可能性があります。ただし、ある algorithm から別のものへ移行する場合など、 application 内で複数の hashing アルゴリズムをサポートする必要がある場合は、HASH_VERIFY
の environment 変数を false
に設定することで、 hash algorithm の検証を無効にすることができます:
HASH_VERIFY=false