ハッシュ(パスワードの保存)
パスワードを元に戻せない形にして保存する「ハッシュ」の使い方を、設定・Hash::make・Hash::check・needsRehash・アルゴリズムの確認まで説明します。
ハッシュとは、元の文字を、元に戻せない別の文字に変えることです。パスワードをそのまま保存すると、データが漏れたときに、そのまま読まれてしまいます。ハッシュにして保存すれば、漏れても元のパスワードは分かりません。Laravel の Hash ファサード(Hash::make() のように、クラス名と :: で機能を呼べる窓口)は、安全な Bcrypt と Argon2 でハッシュにしてくれます。スターターキット(最初から画面や機能がそろった雛形)を使うと、登録とログインの処理は、最初から Bcrypt を使います。
Bcrypt がパスワードのハッシュに向いているのは、「作業係数」(ハッシュにかける手間の大きさ)を変えられるからです。機械の性能が上がっても、ハッシュを作る時間をのばして対応できます。パスワードのハッシュは、遅いほうがよいのです。遅いほど、悪い人が、ありうるすべての文字のハッシュを集めた表(「レインボーテーブル」)を作って、総当たりで攻めるのに時間がかかるからです。
設定#
Laravel は、最初は bcrypt のドライバ(ハッシュの方式)を使います。ほかにも、argon と argon2id のドライバが使えます。
使うドライバは、環境変数(環境ごとに変える設定値)の HASH_DRIVER で決められます。すべてのオプションを細かく変えたいときは、config:publish という Artisan コマンド(php artisan で動かす Laravel のコマンド)で、hashing の設定ファイルを公開します(自分のアプリの config にコピーします)。
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 の memory・time・threads のオプションで、作業係数を変えられます。ただ、これも、Laravel の最初の値で、ほとんどのアプリには十分です。
| オプション | 説明 |
|---|---|
memory |
計算に使ってよいメモリの量の上限(単位は KiB) |
time |
計算をくり返す回数 |
threads |
計算に使うスレッド(同時に動く処理の流れ)の数 |
$hashed = Hash::make('password', [
'memory' => 1024,
'time' => 2,
'threads' => 2,
]);
補足
これらのオプションのくわしい意味は、PHP の公式ドキュメントの、Argon のハッシュの説明(password_hash 関数のページ)を見てください。
パスワードがハッシュと合うか確かめる#
Hash ファサードの check で、文字のパスワードが、ハッシュと合うかを確かめられます。
if (Hash::check('plain-text', $hashedPassword)) {
// パスワードが合っている
}
ハッシュを作り直す必要があるか調べる#
Hash ファサードの needsRehash で、パスワードをハッシュにしたあとに、ハッシュにかける作業係数が変わったかを調べられます。ログインの処理の中で、この確認をするアプリもあります。
if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('plain-text');
}
| メソッド | 説明 |
|---|---|
make |
文字をハッシュにする |
check |
文字が、ハッシュと合うかを確かめる |
needsRehash |
ハッシュを作り直す必要があるかを調べる |
ハッシュのアルゴリズムの確認#
ハッシュのアルゴリズム(作り方)をすり替える攻撃を防ぐため、Hash::check は、まず、渡されたハッシュが、アプリで選んでいるアルゴリズムで作られたかを確かめます。アルゴリズムがちがうと、RuntimeException という例外(エラーを知らせるしくみ)が投げられます。
ふつうのアプリでは、アルゴリズムは変わらないはずです。ちがうアルゴリズムのハッシュが来たら、攻撃のしるしかもしれません。だから、この動きが望ましいのです。ただ、あるアルゴリズムから別のアルゴリズムへ移すときなど、アプリの中で、複数のアルゴリズムを使い続けたいことがあります。そのときは、環境変数 HASH_VERIFY を false にして、アルゴリズムの確認を止められます。
HASH_VERIFY=false
関連するページ#
公式ドキュメント(英語)
2026年10月5日時点の内容をもとに、日本語でまとめています。