【PHP8.x】password_verify関数の使い方
password_verify関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
password_verify関数は、ユーザーが入力したパスワードと、データベースなどに安全に保存されているハッシュ化されたパスワードが一致するかどうかを検証するために使用する関数です。この関数は、主にログイン認証の際に、ユーザーが入力した生のパスワードと、以前にpassword_hash()関数で生成されて保存されたハッシュ値とを比較し、その妥当性を判断します。
第一引数にはユーザーがフォームなどから入力した平文のパスワードを、第二引数にはあらかじめpassword_hash()関数によって生成され、データベースなどに保存されているハッシュ化されたパスワードを指定します。パスワードが一致した場合はブール値のtrueを返し、一致しなかった場合はfalseを返します。
この関数の大きな特徴は、単なる文字列比較ではなく、セキュリティを考慮した安全な方法で検証を行う点です。具体的には、タイミング攻撃などのサイドチャネル攻撃を防ぐための仕組みが内部に組み込まれており、パスワードを安全に取り扱う上で非常に推奨される方法です。パスワードを直接平文で保存することなく、常にハッシュ化された形式で管理し、検証時にこのpassword_verify()関数を使用することで、堅牢な認証システムを構築できます。PHP 8環境において、セキュアなパスワード処理を実現するための基盤となる重要な関数の一つです。
構文(syntax)
1<?php 2$userEnteredPassword = 'mySecurePassword123'; 3$storedHashedPassword = '$2y$10$s.a.l.t.y.h.a.s.h.v.a.l.u.e.f.r.o.m.d.a.t.a.b.a.s.e.h.e.r.e.'; 4 5$isPasswordCorrect = password_verify($userEnteredPassword, $storedHashedPassword); 6?>
引数(parameters)
string $password, string $hash
- string $password: 検証したい平文のパスワード
- string $hash: 検証に使用するハッシュ化されたパスワード
戻り値(return)
bool
指定されたパスワードが、指定されたハッシュ値と一致するかどうかを真偽値(bool)で返します。一致する場合は true、一致しない場合は false を返します。
サンプルコード
PHP password_verify でパスワード検証する
1<?php 2 3/** 4 * password_verify 関数の使用例を示します。 5 * パスワードのハッシュ化(登録時を想定)と、その後の検証(ログイン時を想定)の一連の流れをシミュレートします。 6 * 7 * @param string $plainPassword 検証したい生パスワード 8 * @return void 9 */ 10function demonstratePasswordVerification(string $plainPassword): void 11{ 12 echo "--- 1. パスワードのハッシュ化(ユーザー登録時を想定) ---\n"; 13 // password_hash() は指定されたアルゴリズム(例: bcrypt)を使用してパスワードをハッシュ化します。 14 // PASSWORD_DEFAULT は現時点で推奨されるアルゴリズムを使用します。 15 $hashedPassword = password_hash($plainPassword, PASSWORD_DEFAULT); 16 17 if ($hashedPassword === false) { 18 echo "エラー: パスワードのハッシュ化に失敗しました。\n"; 19 return; 20 } 21 22 echo "生パスワード: " . $plainPassword . "\n"; 23 echo "ハッシュ化されたパスワード (DBに保存される値): " . $hashedPassword . "\n\n"; 24 25 echo "--- 2. パスワードの検証(ログイン時を想定) ---\n"; 26 27 // シナリオ1: ユーザーが正しいパスワードを入力した場合 28 $inputPasswordCorrect = $plainPassword; 29 echo "入力されたパスワード (正しい場合): " . $inputPasswordCorrect . "\n"; 30 31 // password_verify() は、生のパスワードとハッシュ化されたパスワードが一致するかを検証します。 32 if (password_verify($inputPasswordCorrect, $hashedPassword)) { 33 echo "結果: パスワードは一致しました。ログイン成功。\n\n"; 34 } else { 35 echo "結果: パスワードは一致しませんでした。ログイン失敗。\n\n"; 36 } 37 38 // シナリオ2: ユーザーが間違ったパスワードを入力した場合 39 $inputPasswordWrong = "WrongPassword123!"; // 意図的に間違ったパスワード 40 echo "入力されたパスワード (間違っている場合): " . $inputPasswordWrong . "\n"; 41 42 if (password_verify($inputPasswordWrong, $hashedPassword)) { 43 echo "結果: パスワードは一致しました。ログイン成功。\n"; 44 } else { 45 echo "結果: パスワードは一致しませんでした。ログイン失敗。\n"; 46 } 47} 48 49// 実際の使用例として、ユーザーが設定するパスワードを引数に渡します。 50$userProvidedPassword = "MySecretPassword@123"; 51demonstratePasswordVerification($userProvidedPassword); 52 53?>
PHPのpassword_verify関数は、ユーザーが入力した生のパスワードと、データベースなどに安全に保存されているハッシュ化されたパスワードが一致するかどうかを検証するために使用されます。パスワードをそのまま保存することはセキュリティ上のリスクが大きいため、通常はpassword_hash関数などで不可逆なハッシュ形式に変換して保存します。
この関数は、第一引数$passwordにユーザーが入力した生のパスワードを、第二引数$hashにはデータベースなどから取得したハッシュ化されたパスワードを指定します。その結果、パスワードが有効に一致すればtrueを、一致しなければfalseをブール値として返します。
サンプルコードでは、まずpassword_hash関数でパスワードをハッシュ化し、ユーザー登録時に保存される状態をシミュレートしています。次に、ユーザーが正しいパスワードを入力した場合と、意図的に間違ったパスワードを入力した場合の二つのシナリオでpassword_verify関数を呼び出し、パスワードが正しく検証される様子を示しています。これにより、Webアプリケーションにおける安全なパスワード認証の基本的な仕組みを理解できます。
password_verifyは、password_hashで生成されたパスワードのハッシュ値と、ユーザーが入力した生のパスワードが一致するかを安全に検証する関数です。
最も重要な注意点として、生のパスワードを直接データベースに保存することは絶対に避けてください。 必ずpassword_hashでハッシュ化してからデータベースに保存し、ログイン時にはpassword_verifyを使用して検証します。
password_hashは同じパスワードでも実行ごとに異なるハッシュを生成しますが、password_verifyはこの違いを正しく扱えるため問題ありません。また、この関数はパスワードの推測攻撃(ブルートフォース攻撃)を防ぐため、意図的に検証処理に時間をかけることでセキュリティを強化しています。この一連の流れを理解し、正しく利用することがウェブアプリケーションのセキュリティには不可欠です。