password_needs_rehash

関数の概要

password_needs_rehash は、PHPのパスワードハッシュに対して「再ハッシュが必要かどうか」を判定する関数です。ハッシュのアルゴリズムやオプション(コストなど)が更新されたときに、既存のパスワードハッシュを新しい基準で再生成する必要があるかを判定するために使います。セキュリティ向上やパスワード管理のメンテナンスに欠かせない関数です。

パラメータの説明

  • string $hash:検査対象となる既存のパスワードハッシュ文字列。
  • string|int $algo:新しいハッシュアルゴリズムを指定します。PASSWORD_DEFAULTPASSWORD_BCRYPTなどが使えます。
  • array $options(省略可能):ハッシュのオプション。例として['cost' => 12]のように、コストパラメータを指定します。

戻り値

再ハッシュが必要な場合は true を返し、不要な場合は false を返します。これにより、パスワードを再度ハッシュ化し直すべきかが判定できます。

使用例

基本的な使い方

<?php
// 既存のハッシュ文字列(例えばDBから取得)
$hash = '$2y$10$abcdefghijklmnopqrstuv';

// デフォルトアルゴリズムで再ハッシュの必要性を判定
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
    echo "再ハッシュが必要です。";
} else {
    echo "再ハッシュは不要です。";
}
?>

この例では、現在のハッシュが最新のPASSWORD_DEFAULTアルゴリズムに合致しているかをチェックしています。

コストオプションを指定して使用

<?php
$hash = password_hash('password123', PASSWORD_BCRYPT, ['cost' => 10]);

// コストを12に上げたため再ハッシュが必要か確認する
if (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 12])) {
    echo "コストアップにより再ハッシュが必要です。";
} else {
    echo "再ハッシュ不要です。";
}
?>

コストパラメータを変更した場合、既存のハッシュのパラメータと比較して判定が行われます。

古いアルゴリズムとの比較

<?php
// 古いMD5ハッシュ
$oldHash = md5('password123');

// password_needs_rehashはbcrypt系ハッシュを想定しているため
// 直接使うことはできませんが、bcryptに更新した例を示します。
$newHash = password_hash('password123', PASSWORD_BCRYPT);

if (password_needs_rehash($oldHash, PASSWORD_BCRYPT)) {
    // 古いハッシュはもちろん再ハッシュが必要と判断されるはずです
    echo "古いハッシュなので再ハッシュが必要です。";
} else {
    echo "再ハッシュ不要。"; // 通常はここに来ません
}
?>

パスワードハッシュが安全なアルゴリズムに更新されたかを確認するのに役立ちます。

関連する関数

  • password_hash:パスワードをハッシュ化するための関数
  • password_verify:パスワードとハッシュを照合するための関数
  • password_get_info:ハッシュ内容のアルゴリズムやオプション情報を取得する関数

まとめ

password_needs_rehash は、パスワードハッシュの安全性を維持するために重要な関数です。アルゴリズムのアップデートやコスト変更を行った際に既存のパスワードを新基準で再生成すべきかを判定できるため、セキュリティ強化の運用に必須です。実務ではログイン時にこの関数で確認し、必要ならば新しいハッシュを生成して保存を更新するといった運用方法が一般的です。初心者の方もぜひ覚えて安全なパスワード管理に役立ててください。