最新のWeb開発では、ユーザーパスワードのセキュリティを確保することが重要です。テクノロジーの進歩により、新しい暗号化アルゴリズムが出現し続け、古いアルゴリズムが時間の経過とともに現在のニーズに安全にならないか、もはや適切でない場合があります。したがって、開発者は多くの場合、ユーザーエクスペリエンスに影響を与えることなく、パスワード暗号化アルゴリズムを交換する必要があります。 PHPはPassword_needs_rehash()関数を提供します。これにより、パスワード暗号化アルゴリズムのスムーズな遷移がよりシンプルで効率的になります。
password_needs_rehash()は、保存されているパスワードを再クリップする必要があるかどうかを確認するために、PHPに組み込まれた関数です。その機能は、現在保存されているパスワードハッシュ値が新しいパスワード暗号化アルゴリズムと一致するかどうか、または新しいアルゴリズムの要件を満たしているかどうかを判断することです。通常、パスワード暗号化アルゴリズムが変更されると、開発者はこの関数を使用して、ユーザーがパスワードを手動でリセットする必要なくログインするときにパスワードハッシュを自動的に更新できます。
関数は次のように定義されています。
<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_bcrypt 、 password_argon2iなど)。
$オプション:オプションの構成オプション。通常、bcryptなどのアルゴリズム構成を含む配列のコスト係数です。
パスワードを再ハッシュする必要がある場合はtrueを返し、再ハッシュしてもfalseを返してください。
ユーザーがログインすると、最初に古い暗号化アルゴリズムを使用して、ユーザーが入力したパスワードを確認します。この時点で、保存されたパスワードハッシュを再暗号化する必要があるかどうかを確認する必要があります。必要に応じて、新しいアルゴリズムを使用してパスワードを暗号化し、データベースのハッシュ値を更新します。
ユーザーのパスワードが正常に検証された後、 Password_needs_rehash()関数を使用して、現在保存されているパスワードハッシュが新しい暗号化アルゴリズムの要件を満たしているかどうかを判断できます。ハッシュ値を再暗号化する必要がある場合は、新しいアルゴリズムを使用してハッシュを暗号化して更新します。
Password_bcrypt暗号化アルゴリズムを使用した場合と、 password_argon2iにアップグレードする必要があるとします。
<span><span><span class="hljs-comment">// ユーザーが入力したパスワードを取得します</span></span><span>
</span><span><span class="hljs-variable">$user_input_password</span></span><span> = </span><span><span class="hljs-variable">$_POST</span></span><span>[</span><span><span class="hljs-string">'password'</span></span><span>];
</span><span><span class="hljs-comment">// データベースから保存されたハッシュ値を取得します</span></span><span>
</span><span><span class="hljs-variable">$stored_hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getUserHashFromDatabase</span></span><span>(</span><span><span class="hljs-variable">$user_id</span></span><span>);
</span><span><span class="hljs-comment">// 古い暗号化アルゴリズムを使用してパスワードを検証します</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">password_verify</span></span><span>(</span><span><span class="hljs-variable">$user_input_password</span></span><span>, </span><span><span class="hljs-variable">$stored_hash</span></span><span>)) {
</span><span><span class="hljs-comment">// ハッシュ値を再暗号化する必要がある場合</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">$stored_hash</span></span><span>, PASSWORD_ARGON2I, [</span><span><span class="hljs-string">'memory_cost'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span> << </span><span><span class="hljs-number">17</span></span><span>, </span><span><span class="hljs-string">'time_cost'</span></span><span> => </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-string">'threads'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>])) {
</span><span><span class="hljs-comment">// 新しい暗号化アルゴリズムを使用してパスワードを暗号化します</span></span><span>
</span><span><span class="hljs-variable">$new_hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$user_input_password</span></span><span>, PASSWORD_ARGON2I, [</span><span><span class="hljs-string">'memory_cost'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span> << </span><span><span class="hljs-number">17</span></span><span>, </span><span><span class="hljs-string">'time_cost'</span></span><span> => </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-string">'threads'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>]);
</span><span><span class="hljs-comment">// データベースのハッシュ値を更新します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">updateUserHashInDatabase</span></span><span>(</span><span><span class="hljs-variable">$user_id</span></span><span>, </span><span><span class="hljs-variable">$new_hash</span></span><span>);
}
</span><span><span class="hljs-comment">// 正常にログインします,対応する操作を実行します</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"正常にログインします!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// エラーパスワード</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_verify() :ユーザーが入力したパスワードが保存されたハッシュ値と一致することを確認するために使用されます。
password_needs_rehash() :検証が成功したら、保存されたハッシュが新しい暗号化アルゴリズムの要件を満たしているかどうかを確認します。再暗号化が必要な場合は、次の手順に従ってください。
password_hash() :新しい暗号化アルゴリズムを使用してパスワードを暗号化するために使用されます。
updateUserhashindatabase() :新しいパスワードハッシュをデータベースに保存します。
password_needs_rehash()を使用してパスワード暗号化アルゴリズムを置き換える場合、最大の利点は、ユーザーが積極的に介入する必要がなく、ユーザーがログインするとパスワードハッシュアップグレードを自動的に完了できることです。このアプローチはいくつかの重要な利点をもたらします。
シームレスなアップグレード:ユーザーは一度ログインするだけで、システムはパスワードをリセットせずにパスワード暗号化アルゴリズムを自動的にアップグレードします。
セキュリティの改善:より安全な暗号化アルゴリズムに徐々に移行することにより、システムは全体的なセキュリティを改善し、時代遅れのアルゴリズムの使用によって引き起こされるセキュリティの脆弱性を回避できます。
強力な互換性:暗号化アルゴリズムを交換するプロセス中、古いハッシュ値は依然として有効であり、システムの後方互換性を確保し、登録ユーザーに影響を与えません。
パスワード暗号化アルゴリズムを交換することは、セキュリティを強化するために必要な測定値の1つですが、それを実装する場合は、ユーザーエクスペリエンスとシステムのスムーズな遷移を考慮する必要があります。 PHPによって提供されるPassword_needs_rehash()関数は、開発者がユーザーを妨害することなく、古いアルゴリズムから新しいアルゴリズムにパスワード暗号化アルゴリズムをスムーズに移行するのに役立ちます。このようにして、ユーザーのログインエクスペリエンスが影響を受けないようにしながら、システムのセキュリティを改善できます。