PHPでは、 password_needs_rehash関数は、特定のパスワードハッシュを再生する必要があるかどうかを確認するための非常に便利なツールです。一般に、アプリケーションがパスワードハッシュアルゴリズムを更新する必要がある場合に役立ち、新しいアルゴリズムを使用するときに古いハッシュがまだ適切に機能することを保証します。ただし、実際の開発中に、 password_needs_rehashが常にtrueを返すという問題に遭遇する可能性があります。この記事では、この問題の原因を分析し、いくつかの一般的なトラブルシューティング方法を提供します。
password_needs_rehash関数は、2つのパラメーターを受け入れます。
$ hash : password_hashを使用して生成されたハッシュ文字列。
$オプション:再ハッシュに必要なアルゴリズム設定を含む関連配列。
この関数の関数は、合格したハッシュ値が指定されたオプションを満たしているかどうかを確認することです。ハッシュアルゴリズム、コスト、またはその他のオプションが現在の要件を満たしていない場合、関数はTRUEを返し、開発者に新しいオプションでハッシュを再生するように促します。
あなたが渡すハッシュが無効である場合、または形式がpassword_hash関数の出力形式に準拠していない場合、 password_needs_rehashはおそらく常にtrueを返します。たとえば、ハッシュが切り捨てられたり破損している場合、PHPは正しく解析できません。
着信ハッシュ値が有効なパスワードハッシュであるかどうかを確認します。 password_get_info関数を使用して、ハッシュの詳細を確認できます。 Algoname Fieldが返す場合、ハッシュ値に問題がある可能性があります。
<span><span><span class="hljs-variable">$hashInfo</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_get_info</span></span><span>(</span><span><span class="hljs-variable">$hash</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$hashInfo</span></span><span>[</span><span><span class="hljs-string">'algoName'</span></span><span>] === </span><span><span class="hljs-string">''</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'無効なハッシュ値'</span></span><span>;
}
</span></span>
password_needs_rehash関数$オプションの2番目のパラメーターは、必要なハッシュアルゴリズム設定(アルゴリズム、コストファクターなど)を指定するために使用されます。渡すオプションが元のハッシュの設定と矛盾している場合、現在のハッシュが新しい要件を満たしていないと考えているため、関数は真実です。
password_needs_rehashを呼び出すときは、 $オプションパラメーターが元のハッシュが呼び出されたときに使用される設定と一致していることを確認してください。現在のハッシュがデフォルトのpassword_defaultアルゴリズムとコスト設定に準拠しているかどうかを確認する場合は、次のように書くことができます。
<span><span><span class="hljs-variable">$options</span></span><span> = [</span><span><span class="hljs-string">'cost'</span></span><span> => </span><span><span class="hljs-number">10</span></span><span>]; </span><span><span class="hljs-comment">// 現在のアプリケーションで推奨されるものを使用します cost 価値</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">password_needs_rehash</span></span><span>(</span><span><span class="hljs-variable">$hash</span></span><span>, PASSWORD_DEFAULT, </span><span><span class="hljs-variable">$options</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'パスワードハッシュを再生する必要があります'</span></span><span>;
}
</span></span>
phpのpassword_hash関数は、 password_bcrypt 、 password_argon2i 、 password_argon2idなど、ハッシュするときに異なるアルゴリズムをサポートします。ハッシュ値を渡すときにサポートされていないハッシュ形式を誤って使用する場合、 password_needs_rehashは、ハッシュを解析または認識できないため、常にtrueを返します。
使用しているハッシュアルゴリズムが現在のPHPバージョンでサポートされていることを確認してください。開発環境で時代遅れのPHPバージョンを使用している場合は、PHPのアップグレードまたはそのバージョンと互換性のあるハッシュアルゴリズムを使用することを検討してください。
Password_needs_rehashが常にtrueを返す場合があります。または、コードロジックのエラーが原因である場合があります。たとえば、ハッシュ値は他の場所で誤って変更されるか、呼び出し時にパラメーターが混乱する場合があります。
パスワード_needs_rehashを呼び出す前に、ハッシュ値とオプションが正しく渡されていることを確認するために、コードを確認してください。たとえば、最初にハッシュ値とオプションを印刷して、期待を満たすことを確認できます。
<span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$hash</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$options</span></span><span>);
</span></span>
PHPのさまざまなバージョンは、 password_needs_rehashの実装に微妙な違いがある場合があります。場合によっては、PHPの低いバージョンにはバグがあり、一部のハッシュケースでは機能が常にTRUEを返します。
使用しているPHPバージョンが関連するバグを修正したことを確認してください。 PHPの最新の安定バージョン、または少なくとも1つのPHP 7.4以降を使用することをお勧めします。
password_needs_rehash関数の目的は、パスワードハッシュアルゴリズムまたは設定が変更されたときに開発者がハッシュを更新し、時代遅れのハッシュ値を使用することによって引き起こされるセキュリティの脆弱性を回避できるようにすることです。ただし、関数が常にTrueを返すという問題に遭遇した場合、次のようにトラブルシューティングできます。
ハッシュが有効であり、破損していないことを確認してください。
渡されたオプションがハッシュ値と一致するかどうかを確認します。
ハッシュ形式が現在のPHPバージョンと互換性があることを確認してください。
コードロジックを確認して、パラメーターが正しく渡されていることを確認してください。
PHPバージョンに既知のバグがないことを確認したり、より高いバージョンにアップグレードしたりしてください。
これらのトラブルシューティング方法により、問題の根本原因を見つけて、それをスムーズに解決できるはずです。