Password_needs_rehash関数は、指定されたパスワードハッシュ、選択されたアルゴリズム、コスト、その他のオプションに基づいて、現在保存されているパスワードハッシュを更新する必要があるかどうかを判断します。関数の署名は次のとおりです。
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">password_needs_rehash</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$hash</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$algo</span></span><span> , </span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$options</span></span><span> )
</span></span>
$ hash :チェックする必要があるパスワードハッシュ。
$ algo :使用されるハッシュアルゴリズム( password_defaultやpassword_bcryptなど)。
$オプション:通常、ハッシュのコストを含む構成オプションのセット。
この関数の関数は、現在のパスワードのハッシュが現在の構成要件を満たしているかどうかを確認することです。一致しない場合、それは真実で戻り、ハッシュを更新する必要があることを示します。
Password_Defaultは、PHPのデフォルトのハッシュアルゴリズムです。通常、 bcryptを使用しますが、将来的にはアルゴリズムの改善に置き換えることができます。 PHPバージョンがアップグレードされた場合、またはセキュリティライブラリが変更された場合、 Password_Defaultは新しいアルゴリズムを使用する場合があります。
たとえば、PHP 5.6では、 password_defaultを使用してパスワードハッシュを生成して保存します。 PHPが7.xにアップグレードされると、 Password_Defaultが別のアルゴリズムになる可能性があります( BCRYPTからArgon2に変更されると仮定します)。 password_needs_rehashを使用してパスワードハッシュを確認する場合、以下が発生する可能性があります。
保存されたパスワードは、古いハッシュアルゴリズムを使用します。
システムには新しいハッシュアルゴリズム( Argon2など)が必要ですが、 password_needs_rehashはこれらの違いを検出できません。
これを避けるために、特に実稼働環境で、 Password_Defaultに依存する代わりに、アルゴリズムを明示的に指定することをお勧めします。 PHPが将来新しいアルゴリズムに切り替えた場合でも、プロジェクトのニーズに合った明確なハッシュアルゴリズムを使用していることを保証できます。
<span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_BCRYPT);
</span></span>
Password_needs_rehashは、パスワードハッシュのコスト係数(たとえば、BCRYPTのコスト係数)もチェックします。システム構成のコスト係数(たとえば、10〜12)を変更し、古いパスワードハッシュが低コスト係数を使用する場合、 password_needs_rehashはハッシュを更新する必要があることを正しく検出できない場合があります。
パスワードハッシュが生成されるたびに、現在のコスト係数が使用されることを常に確認してください。パスワードのハッシュアップデートで遅延を避けるために、ユーザーがログインするたびにパスワードハッシュを確認して更新できます。
<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">12</span></span><span>]; </span><span><span class="hljs-comment">// 適切なコストファクターを使用します</span></span><span>
</span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_BCRYPT, </span><span><span class="hljs-variable">$options</span></span><span>);
</span></span>
password_needs_rehashには、ハッシュ値、アルゴリズム、構成オプションの3つのパラメーターが必要です。これらのパラメーターが誤って渡された場合、関数が正しく機能しない場合があります。一般的な質問は次のとおりです。
$オプションアレイは正しく渡されず、コスト要因またはその他の構成パラメーターが失われます。
渡されたハッシュは、そのハッシュを生成するために使用されるアルゴリズムと一致しません。
password_needs_rehashを呼び出すときは、正しいパラメーターを渡すことを確認してください。これが例です:
<span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_BCRYPT, [</span><span><span class="hljs-string">'cost'</span></span><span> => </span><span><span class="hljs-number">12</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_BCRYPT, [</span><span><span class="hljs-string">'cost'</span></span><span> => </span><span><span class="hljs-number">12</span></span><span>])) {
</span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_BCRYPT, [</span><span><span class="hljs-string">'cost'</span></span><span> => </span><span><span class="hljs-number">12</span></span><span>]);
}
</span></span>
$ハッシュが選択したアルゴリズムおよび構成オプションと一致していることを確認してください。
パスワードハッシュアルゴリズムと構成は、時間の経過とともにより強力になる場合がありますが、ある時点でも時代遅れになる場合があります。したがって、 password_needs_rehashを使用してパスワードハッシュを更新する必要があるかどうかを判断することに加えて、パスワードを定期的にリセットすることも適切なセキュリティプラクティスです。ユーザーがログインするたびにハッシュを更新する必要があるかどうかを確認できます。
多くの異なるPHPバージョンまたは構成と互換性がある場合がある場合があります。この場合、 password_needs_rehashの動作は、異なるバージョン間の違いの影響を受ける可能性があります。したがって、システムが使用しているPHPのバージョンと互換性があることを確認し、必要に応じてそれに応じて調整してください。
password_needs_rehashは、パスワードハッシュが現在の構成要件を満たしているかどうかを検出するための強力なツールです。ただし、実際の使用中に、いくつかの構成問題が発生する可能性があり、関数の不正確な判断につながる可能性があります。一般的な構成の問題には、アルゴリズムの変更、コスト係数の更新、不適切なパラメーター伝送が含まれます。これらの問題の解決策は、ハッシュアルゴリズムとコスト要因を明示的に指定し、パスワードが更新されるたびに現在の構成が使用されていることを確認し、パスワードセキュリティポリシーを定期的に確認することです。
これらの一般的な問題とそのソリューションを理解することにより、ユーザーのパスワードのセキュリティを確保し、潜在的なセキュリティリスクを回避できます。