【PHP8.x】password_needs_rehash関数の使い方

password_needs_rehash関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

password_needs_rehash関数は、既存のパスワードハッシュが現在の推奨設定に基づいて再生成する必要があるかどうかを判定する関数です。この関数は、主にアプリケーションのセキュリティを継続的に維持・向上させる目的で使用されます。

パスワードのハッシュ化に用いるアルゴリズムやその強度(コストパラメータ)は、時間の経過とともに新しい脅威に対応するために見直されることがあります。例えば、ユーザーがシステムに登録した当時のハッシュ設定が、現在では古くなっていたり、より高いセキュリティレベルが必要になったりする場合があります。

password_needs_rehash関数は、引数としてデータベースに保存されている既存のハッシュ、現在推奨されるハッシュアルゴリズム(例: PASSWORD_BCRYPT)、およびそのオプション(例: コスト値)を受け取ります。そして、既存のハッシュがこれらの現在の推奨基準を満たしていない場合にtrueを返します。

通常、ユーザーがログインする際にpassword_verify関数でパスワードの正当性を確認した後、このpassword_needs_rehash関数を使って、そのハッシュが最新のセキュリティ要件を満たしているかを確認します。もしtrueが返された場合、ユーザーが入力した平文のパスワードを最新の設定で再度ハッシュ化し、データベースに保存し直すことで、ユーザーにパスワードの変更を求めることなく、システムのセキュリティレベルを向上させることができます。これにより、透過的にセキュリティ対策を施すことが可能となります。

構文(syntax)

1<?php
2$hash = '$2y$10$abcdefghijklmnopqrstuvwxyzaBCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.';
3$algo = PASSWORD_DEFAULT;
4$options = ['cost' => 12];
5
6$needsRehash = password_needs_rehash($hash, $algo, $options);
7?>

引数(parameters)

string $hash, int $algo, array $options = []

  • string $hash: 比較対象となるパスワードハッシュ文字列
  • int $algo: 使用するハッシュアルゴリズム定数 (例: PASSWORD_DEFAULT)
  • array $options = []: ハッシュアルゴリズムのオプションを指定する連想配列

戻り値(return)

bool

この関数は、指定されたパスワードハッシュが現在の推奨アルゴリズムまたはオプションで再ハッシュする必要があるかどうかを示します。trueを返す場合は再ハッシュが必要であり、falseを返す場合は不要です。

サンプルコード

PHPパスワードハッシュの更新確認

1<?php
2
3/**
4 * このスクリプトは、PHPのパスワードハッシュ機能の基本的な使い方と、
5 * パスワードのハッシュを最新のセキュリティ設定に更新する必要があるかを
6 * 確認する方法 (`password_needs_rehash`) を示します。
7 */
8
9// ユーザーが入力したパスワードをシミュレート
10$userPassword = 'SecurePassword123!';
11
12// --- 1. パスワードの初期ハッシュ化 ---
13// 例として、ユーザーが新規登録した際にパスワードをハッシュ化して保存するケース
14
15// 現在推奨されているアルゴリズム (bcrypt) とコストを指定
16// コストは計算量を示し、高いほど安全ですが、処理時間も増えます。
17$currentAlgo = PASSWORD_BCRYPT;
18$currentOptions = ['cost' => 10]; // 初期設定としてコスト10を使用
19
20// パスワードをハッシュ化
21$storedHash = password_hash($userPassword, $currentAlgo, $currentOptions);
22
23echo "初期ハッシュ: " . $storedHash . PHP_EOL;
24
25// ハッシュ化されたパスワードが正しいか検証 (ログイン時などを想定)
26if (password_verify($userPassword, $storedHash)) {
27    echo "初期ハッシュの検証: 成功" . PHP_EOL . PHP_EOL;
28} else {
29    echo "初期ハッシュの検証: 失敗" . PHP_EOL . PHP_EOL;
30}
31
32// --- 2. ハッシュのリハッシュが必要かどうかの確認 ---
33// セキュリティ要件の変更や、より強力なアルゴリズム/コストが推奨されるようになった場合を想定
34
35// 新しく推奨されるアルゴリズムとオプションを定義 (例: コストを12に引き上げ)
36$newDesiredAlgo = PASSWORD_BCRYPT;
37$newDesiredOptions = ['cost' => 12]; // セキュリティ強化のためコストを12に設定
38
39echo "現在のハッシュが、新しい推奨設定 (コスト12) に合致しているか確認中..." . PHP_EOL;
40
41// password_needs_rehash 関数を使用して、既存のハッシュが新しい設定で再ハッシュ化されるべきかを確認
42if (password_needs_rehash($storedHash, $newDesiredAlgo, $newDesiredOptions)) {
43    echo "再ハッシュが必要です!セキュリティ設定を更新します。" . PHP_EOL;
44
45    // パスワードを新しい設定で再ハッシュ化
46    $rehashedPassword = password_hash($userPassword, $newDesiredAlgo, $newDesiredOptions);
47
48    echo "新しいハッシュ: " . $rehashedPassword . PHP_EOL;
49
50    // データベース内のハッシュを新しいものに更新する処理をシミュレート
51    $storedHash = $rehashedPassword;
52
53    // 再ハッシュ後の検証
54    if (password_verify($userPassword, $storedHash)) {
55        echo "新しいハッシュの検証: 成功" . PHP_EOL . PHP_EOL;
56    } else {
57        echo "新しいハッシュの検証: 失敗" . PHP_EOL . PHP_EOL;
58    }
59
60} else {
61    echo "再ハッシュは不要です。現在のハッシュは最新の推奨設定に準拠しています。" . PHP_EOL . PHP_EOL;
62}
63
64// --- 3. 再度、リハッシュが必要かどうかの確認 ---
65// すでに新しい設定に更新されているため、リハッシュは不要と判定されるはず
66
67echo "更新後のハッシュが、新しい推奨設定 (コスト12) に合致しているか最終確認中..." . PHP_EOL;
68if (password_needs_rehash($storedHash, $newDesiredAlgo, $newDesiredOptions)) {
69    echo "エラー: 再ハッシュが依然として必要です。" . PHP_EOL;
70} else {
71    echo "期待通り: 再ハッシュは不要です。現在のハッシュは最新の推奨設定に準拠しています。" . PHP_EOL;
72}
73
74?>

PHPのpassword_needs_rehash関数は、システムに保存されているパスワードハッシュが、現在推奨されるセキュリティ設定(アルゴリズムや計算コスト)で再ハッシュ化される必要があるかどうかを判断するために利用されます。これは、セキュリティ要件が時間の経過とともに変化したり、より強力なハッシュ設定が推奨されるようになった場合に、既存のパスワードハッシュを安全に更新するために重要な機能です。

この関数は、三つの引数を取ります。一つ目の$hashには、検証したい既存のパスワードハッシュ文字列を渡します。二つ目の$algoには、現在推奨するハッシュアルゴリズム(例えばPASSWORD_BCRYPT定数)を指定します。そして、三つ目の$optionsには、そのアルゴリズムに適用するオプション(例えば['cost' => 12]といった計算コストの設定)を配列で渡します。

戻り値はbool型で、現在のハッシュが指定された新しいアルゴリズムやオプションを満たしておらず、再ハッシュ化が必要な場合にtrueを返します。すでに新しい設定に準拠している場合はfalseを返します。

サンプルコードでは、まずpassword_hash関数でパスワードを初期ハッシュ化した後、password_needs_rehashを使って、より高いセキュリティレベル(コスト12)が推奨される状況をシミュレートしています。password_needs_rehashtrueを返せば、ユーザーにパスワードを再入力させることなく、そのパスワードを新しい設定で再ハッシュ化し、データベースのハッシュを更新することでセキュリティを向上させることができます。これにより、常に最新のセキュリティ要件に合わせたパスワード管理を実現し、システムの安全性を高めることが可能です。

パスワードは必ずpassword_hashでハッシュ化して保存し、平文での保存は避けてください。password_hashcostオプションは、システムの負荷とセキュリティ強度を考慮して適切に設定し、定期的に見直すことが重要です。password_needs_rehash関数は、データベースに保存されたハッシュが、現在推奨されるアルゴリズムやオプション(コストなど)に合致しているかを確認するために使用します。この関数がtrueを返した場合、ユーザーのログイン時などに新しい設定でパスワードを再ハッシュ化し、古いハッシュと置き換えることでセキュリティを最新の状態に保つことが強く推奨されます。パスワードの検証にはpassword_verifyを必ず使用し、ハッシュ値を直接比較しないよう注意してください。

関連コンテンツ

【PHP8.x】password_needs_rehash関数の使い方 | いっしー@Webエンジニア