PHPでは、 password_needs_rehash関数を使用して、現在指定されているアルゴリズムとオプションを使用してパスワードハッシュ値を再ハッシュする必要があるかどうかを判断します。システムのハッシュポリシーの変更( BcryptからArgon2IDへのアップグレード、コストファクターの変更など)が、ユーザーがログインすると古いハッシュを新しい標準に静かにアップグレードするのに役立ちます。ただし、開発者はこの機能を使用すると「非生産的に見える」状況に遭遇する可能性があります。 Password_needs_rehashが有効にならない理由を分析し、最も一般的な理由であるハッシュアルゴリズムの設定エラーを説明することに焦点を当てましょう。
$hash = password_hash('mypassword', PASSWORD_DEFAULT);
$options = ['cost' => 12];
if (password_needs_rehash($hash, PASSWORD_DEFAULT, $options)) {
$hash = password_hash('mypassword', PASSWORD_DEFAULT, $options);
}
このロジックは、元のハッシュが現在のアルゴリズムまたはパラメーターに適合しない場合、再ハッシュされます。
password_needs_rehashのコア基盤は、渡すアルゴリズムとパラメーターです。これらのパラメーターを誤って設定すると、差を判断することができず、したがって、更新が不要であると考えて誤って誤って返します。
多くの開発者は、 Password_Defaultを使用する限り、PHPは自動的にアルゴリズムをアップグレードすると考えています。例えば:
$oldHash = password_hash('mypassword', PASSWORD_BCRYPT); // 明示的に使用します bcrypt
次に、次のように変更します。
$options = ['cost' => 12];
$needsRehash = password_needs_rehash($oldHash, PASSWORD_DEFAULT, $options);
問題は、 Password_Defaultは現在(PHP 8.3の時点で)パスワード_BCRYPTであり、 Password_needs_rehashは、アルゴリズムがまだbcryptであると考えているため、アルゴリズムの矛盾を見つけません。この時点で、あなたはそれが真であると予想されるかもしれませんが、それは偽りに戻ります。
多くの人はコストパラメーター(コストなど)に合格しますが、元のハッシュ値で同じコストが既に使用されている場合、関数は「再ハッシュが必要」と判断されません。手動で['cost' => 10]を書いていて、元々10だったとしても、この場合は機能がfalseを返します。
$hash = password_hash('mypassword', PASSWORD_BCRYPT, ['cost' => 10]);
$needsRehash = password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 10]);
// 結果はまだです false,変更がないからです
変更が発生したときにハッシュ戦略が正しく知覚されることを確認するために、次のプラクティスが推奨されます。
新しいアルゴリズムを明確に設定します( password_bcryptからpassword_argon2idへのアップグレードなど);
10から12に増加するなど、コストパラメーターを明示的に更新します。
可能であれば、元のハッシュポリシーを統合アップグレードの構成アイテムとして維持します。
$hash = password_hash('mypassword', PASSWORD_ARGON2ID);
$needsRehash = password_needs_rehash($hash, PASSWORD_ARGON2ID, [
'memory_cost' => 1<<17,
'time_cost' => 4,
'threads' => 2
]);
password_needs_rehashが期待どおりに機能していないと疑っている場合は、デバッグ中にハッシュ文字列を出力して確認できます。ハッシュプレフィックスは通常、使用されるアルゴリズムを表します。
$ 2y $はbcryptを意味します
$ argon2id $はargon2idを意味します
新しいアルゴリズムが実際にこれらのプレフィックスを観察することによって使用されるかどうかを確認できます。
さらに、現在使用されているハッシュポリシーを確認するために、現在の構成をロギングで出力するか、バックグラウンド管理ページを作成することができます。
password_needs_rehashは、トランジションパスワードのハッシュ戦略をスムーズにするのに役立つ非常に実用的な機能ですが、「魔法」ではありません。違いを判断するために提供するパラメーターに依存します。セットアップが間違っている場合、ハッシュが時代遅れであっても更新は不要であると考えるかもしれません。したがって、ハッシュ戦略構成を明確に制御可能に保つことが、関数の有効性を確保するための鍵です。
Rehashが必要な時期を正しく決定することが、パスワードセキュリティの進化における最初のステップであることをコードが正しく決定することを保証します。オンラインプロジェクトでは、ハッシュポリシーを集中化するように構成し、アップグレード計画を定期的に評価して、セキュリティポリシーが過去に留まらないようにすることをお勧めします。