password_needs_rehash関数は、既存のパスワードのハッシュ値を新しいアルゴリズムまたは暗号化パラメーターを使用して更新する必要があるかどうかを確認するために使用されます。現在のパスワードのハッシュを指定された暗号化パラメーター(アルゴリズム、コスト要因など)と比較します。既存のパスワードハッシュが新しい要件を満たしていない場合、それはtrueを返し、それ以外の場合はfalseを返します。
<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">$hashedPassword</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">$newHash</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-comment">// データベースでパスワードを更新します</span></span><span>
}
</span></span>この例では、 password_needs_rehashは、 $ hashedpasswordが指定された暗号化パラメーター(コストパラメーターなど)を満たしているかどうかを確認します。それが満たされない場合、パスワードを再暗号化する必要があります。
パスワードハッシュアルゴリズムの継続的な更新とアップグレードにより、古いアルゴリズムで暗号化されたパスワードはセキュリティリスクに直面する可能性があります。たとえば、PHPは最初はMD5やSHA-1などのアルゴリズムを使用して暗号化されていましたが、これらのアルゴリズムは脆弱であることが証明されています。 BcryptやArgon2などの最新の暗号化アルゴリズムの出現により、これらのアルゴリズムを使用して暗号化されたパスワードはより安全です。
password_needs_rehash関数の導入により、開発者はパスワードを保存するときにパスワードを柔軟に更新できます。たとえば、BCRyptをArgon2に置き換えることにした場合、もともとBCRyptで暗号化されていたパスワードを検出し、 Password_needs_rehashを介して新しい暗号化方法に更新できます。このようにして、データベースに保存されているパスワードでさえ、ユーザーが次にログインするときに新しい暗号化アルゴリズムに自動的に移行できます。
暗号化アルゴリズム自体のセキュリティは、アルゴリズム自体だけでなく、アルゴリズムのパラメーター設定(BCRYPTのコストパラメーターなど)にも依存します。コストパラメーターは、ハッシュ計算の時間の複雑さを決定します。値が高いとセキュリティが高くなる可能性がありますが、計算時間が長くなる可能性もあります。
最初にパスワードを保存するためにコスト10でBCRyptアルゴリズムを使用したとしますが、時間の経過とともに、サーバーの処理能力が強く、セキュリティを改善するためにより高いコスト値を使用できることがわかります。 password_needs_rehashを使用して、データベースに保存されている古いパスワードが低コストを使用しているかどうかを確認し、必要に応じて更新できます。
<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">$hashedPassword</span></span><span>, PASSWORD_BCRYPT, [</span><span><span class="hljs-string">'cost'</span></span><span> => </span><span><span class="hljs-number">14</span></span><span>])) {
</span><span><span class="hljs-variable">$newHash</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">14</span></span><span>]);
</span><span><span class="hljs-comment">// データベースでパスワードを更新します</span></span><span>
}
</span></span>この例では、元のハッシュのコストが14未満の場合、再暗号化が必要です。
password_needs_rehashは、ハッシュを更新する必要があるかどうかを簡単に検出する方法を提供しますが、このプロセスはパフォーマンスに何らかの影響を与える可能性があります。特に、大規模なユーザーまたは頻繁なデータベースアクセスがある場合、ハッシュはユーザーがログインするたびに、サーバーの負担を増やす可能性があります。
パフォーマンスへの影響を減らすために、パスワードのログインが成功したときに、バックグラウンドのパスワードの再暗号化を非同期的に処理することをお勧めします。これは、パスワードの再暗号化がユーザーのインスタントエクスペリエンスに影響を与えるのではなく、バックグラウンドのデータベースのパスワードハッシュを徐々に更新することを意味します。
パスワードのハッシュが現在のセキュリティ基準を満たしているかどうかを定期的に確認することにより、 Password_needs_rehashを使用すると、システムのセキュリティを大幅に改善できます。更新が行われない場合、次のリスクが発生する可能性があります。
古いアルゴリズムのセキュリティの問題:MD5やSHA1などの古い暗号化アルゴリズムは安全ではなく、攻撃者はレインボーテーブルやその他の方法でこれらのパスワードを簡単にクラックすることができます。
不適切なパラメーター設定:コストが低すぎると、パスワードはブルートフォース攻撃に対して脆弱である可能性があります。攻撃者は、多数の可能なパスワードの組み合わせを実験することにより、ハッシュを割る。
パスワードのハッシュを定期的に検出して更新すると、パスワードストレージが常に現在の最良のセキュリティプラクティスに準拠していることを確認することができます。