【PHP8.x】password_get_info()関数の使い方
password_get_info関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
password_get_info関数は、すでにハッシュ化されたパスワードに関する詳細な情報を取得する関数です。この関数は、セキュリティのために元のパスワードが特定できないように変換された文字列(ハッシュ)を分析し、そのハッシュがどのアルゴリズムとどのようなオプションを使って生成されたかを明らかにします。
システムエンジニアとしてパスワードを安全に管理することは非常に重要です。時代とともに、より強力なハッシュアルゴリズムや推奨されるセキュリティ設定が更新されることがあります。password_get_info関数は、既存のパスワードハッシュが現在の最新の推奨設定で作成されたものかどうかを判断するために利用されます。
この関数の引数には、情報を取得したいハッシュ化されたパスワードの文字列を一つ指定します。戻り値は連想配列形式で提供され、主に三つのキーが含まれます。algoキーは、ハッシュの生成に用いられたアルゴリズムの識別子(例:PASSWORD_BCRYPTなど)を示します。algoNameキーは、そのアルゴリズムの人間が読める名称(例:「bcrypt」)を表します。そしてoptionsキーは、ハッシュ生成時に設定されたコストなどの詳細なオプションを含む別の連想配列を保持しています。
この関数から得られる情報を使うことで、例えばpassword_needs_rehash関数と組み合わせて、古い方式でハッシュ化されたパスワードをより安全な新しい方式で再ハッシュすべきかを判断し、システムのセキュリティレベルを継続的に維持・向上させることが可能になります。
構文(syntax)
1password_get_info($hash);
引数(parameters)
string $hash
- string $hash: 情報を取得したいパスワードハッシュ文字列
戻り値(return)
array
指定されたパスワードハッシュ情報を含む連想配列を返します。この配列には、アルゴリズム名、オプション、およびソルトなどの情報が含まれます。
サンプルコード
PHP password_hash、password_get_info、password_verify の動作デモ
1<?php 2 3/** 4 * パスワードのハッシュ化、情報取得、検証の例を示します。 5 * システムエンジニアを目指す初心者向けに、パスワード処理の基本的な流れを理解できるように作成されています。 6 * 7 * @param string $plainPassword 検証する平文のパスワード。 8 * @return void 9 */ 10function demonstratePasswordHandling(string $plainPassword): void 11{ 12 echo "--- パスワード処理のデモンストレーション ---" . PHP_EOL; 13 14 // 1. パスワードのハッシュ化 15 // password_hash() は、平文のパスワードを安全なハッシュに変換します。 16 // PASSWORD_DEFAULT は、PHP の推奨する最新の堅牢なハッシュアルゴリズム(現在では bcrypt)を使用します。 17 // 同じ平文のパスワードでも、salt が自動生成されるため、毎回異なるハッシュが生成されます。 18 $hashedPassword = password_hash($plainPassword, PASSWORD_DEFAULT); 19 20 echo "元のパスワード: " . $plainPassword . PHP_EOL; 21 echo "ハッシュ化されたパスワード: " . $hashedPassword . PHP_EOL . PHP_EOL; 22 23 // 2. ハッシュの情報を取得 (password_get_info) 24 // password_get_info() は、指定されたハッシュに関する情報(使用されたアルゴリズム、オプションなど)を配列で返します。 25 $passwordInfo = password_get_info($hashedPassword); 26 27 echo "--- ハッシュ情報 (password_get_info) ---" . PHP_EOL; 28 echo "アルゴリズム名: " . ($passwordInfo['algoName'] ?? '不明') . PHP_EOL; 29 echo "アルゴリズムID: " . ($passwordInfo['algo'] ?? '不明') . PHP_EOL; 30 echo "オプション: " . print_r($passwordInfo['options'], true) . PHP_EOL . PHP_EOL; 31 32 // 3. パスワードの検証 (password_verify) 33 // password_verify() は、平文のパスワードとハッシュ化されたパスワードが一致するかを安全に検証します。 34 // これがログイン時などに使用される主要な関数です。 35 // password_verify() は自動的にハッシュから salt を抽出し、提供されたパスワードと比較します。 36 37 echo "--- パスワード検証 (password_verify) ---" . PHP_EOL; 38 39 // 正しいパスワードでの検証 40 if (password_verify($plainPassword, $hashedPassword)) { 41 echo "検証結果 (正しいパスワード): 成功。パスワードは一致しました。" . PHP_EOL; 42 } else { 43 echo "検証結果 (正しいパスワード): 失敗。パスワードが一致しませんでした。(これは異常)" . PHP_EOL; 44 } 45 46 // 誤ったパスワードでの検証 47 $incorrectPassword = "wrong_password"; 48 if (password_verify($incorrectPassword, $hashedPassword)) { 49 echo "検証結果 (誤ったパスワード): 成功。パスワードが一致しました。(これは異常)" . PHP_EOL; 50 } else { 51 echo "検証結果 (誤ったパスワード): 失敗。パスワードが一致しませんでした。(期待通り)" . PHP_EOL; 52 } 53 54 echo PHP_EOL . "---------------------------------------" . PHP_EOL; 55} 56 57// サンプル関数の実行 58// ここでは仮のユーザーパスワードを想定しています。 59demonstratePasswordHandling("MySuperSecurePass123!");
PHPでは、ユーザーパスワードを安全に管理するため、平文ではなくハッシュ化して保存します。password_hash()関数で、元のパスワードは復元不可能な安全なハッシュ値に変換されます。
password_get_info()関数は、指定ハッシュ値(string $hash引数)に関する詳細情報を配列で返します。戻り値には、ハッシュ化アルゴリズム名やID、生成時のオプション(例:コスト値)などが含まれ、プログラムでハッシュの状態を確認できます。
パスワード検証にはpassword_verify()関数を使います。これは入力された平文パスワードと保存ハッシュ値が一致するかを安全にチェックし、ハッシュから必要な情報を自動抽出し比較します。password_get_info()は直接検証に関わりませんが、ハッシュのセキュリティ設定や生成情報を確認する際に役立ち、password_hash()やpassword_verify()と並び、PHPにおける安全なパスワード処理の理解に不可欠な関数です。
パスワードはpassword_hash()で必ずハッシュ化し、データベースに平文で保存しないでください。PASSWORD_DEFAULTを用いることで、PHPが推奨する最新の安全なアルゴリズムが適用され、同じパスワードでも毎回異なるハッシュが生成されます。
password_get_info()は、ハッシュがどのアルゴリズムやオプションで生成されたかといった情報を確認するために利用します。これは、将来的にハッシュアルゴリズムを更新する必要があるかなどを判断する際に役立ちます。
ユーザーが入力したパスワードと保存済みのハッシュを比較検証する際は、password_verify()を必ず使用してください。生成されたハッシュ値を文字列として直接比較すると、誤った検証結果となり、セキュリティ上の問題につながります。これらの関数は、安全なパスワード処理の基本であり、適切に利用することが極めて重要です。
PHP passwords関数でパスワード検証する
1<?php 2 3/** 4 * ユーザーパスワードのハッシュ化、検証、およびハッシュ情報の取得を行うサンプルコードです。 5 * password_hash、password_verify、password_get_info関数の使い方を示します。 6 */ 7 8// 1. ユーザーから入力されたパスワードを想定します 9$userPassword = 'mysecretpassword'; 10 11// 2. パスワードをハッシュ化します(通常はデータベースに保存される形式) 12// PASSWORD_DEFAULT は現在推奨されているハッシュアルゴリズムを使用します 13$hashedPassword = password_hash($userPassword, PASSWORD_DEFAULT); 14 15echo "元のパスワード: " . $userPassword . "\n"; 16echo "ハッシュ化されたパスワード: " . $hashedPassword . "\n\n"; 17 18// 3. ログイン時など、ユーザーが入力したパスワードを検証します 19$inputPasswordForVerification = 'mysecretpassword'; // ユーザーが入力したパスワード 20 21echo "検証するパスワード: " . $inputPasswordForVerification . "\n"; 22 23if (password_verify($inputPasswordForVerification, $hashedPassword)) { 24 echo "パスワードは一致しました。\n"; 25 26 // 4. ハッシュ化されたパスワードの情報を取得します 27 // これにより、使用されているアルゴリズムやオプションを確認できます 28 $hashInfo = password_get_info($hashedPassword); 29 30 echo "ハッシュ情報:\n"; 31 echo " アルゴリズム: " . $hashInfo['algoName'] . "\n"; // 例: bcrypt 32 echo " オプション: " . json_encode($hashInfo['options']) . "\n"; // 例: {"cost":10} 33 34 // パスワードを再ハッシュする必要があるか確認することもできます 35 // if (password_needs_rehash($hashedPassword, PASSWORD_DEFAULT, ['cost' => 12])) { 36 // echo "パスワードは再ハッシュが必要です。\n"; 37 // // $newHashedPassword = password_hash($userPassword, PASSWORD_DEFAULT, ['cost' => 12]); 38 // // データベースを更新する処理 39 // } else { 40 // echo "パスワードは再ハッシュの必要はありません。\n"; 41 // } 42 43} else { 44 echo "パスワードは一致しませんでした。\n"; 45} 46 47?>
このPHPサンプルコードは、ユーザーパスワードのハッシュ化、検証、およびハッシュ情報の取得方法をシステムエンジニア初心者向けに示しています。まず、password_hash関数を用いて、入力されたパスワード(例: mysecretpassword)を安全なハッシュ形式に変換します。このハッシュ値は、データベースに保存されることを想定しています。
次に、ユーザーがログイン時などに入力したパスワードと保存されたハッシュ値を比較するため、password_verify関数を使用します。この関数は、入力パスワードがハッシュ値と一致すれば真(true)を、一致しなければ偽(false)を戻り値として返します。これにより、元のパスワードを復元することなく、安全に認証処理を実行できます。
最後に、password_get_info関数は、引数として渡されたハッシュ化されたパスワード($hash)の生成情報を取り出すために使われます。この関数は、使用されたハッシュアルゴリズムの名前(algoName)や、ハッシュ生成時のオプション(options)などを含む連想配列を戻り値として提供します。これにより、ハッシュパスワードの詳細な設定を確認し、セキュリティ要件の監査や更新の必要性を判断する際に役立ちます。
パスワードは平文で保存せず、必ずpassword_hash関数でハッシュ化し、データベースなどに保存してください。PASSWORD_DEFAULTは、現在推奨されるアルゴリズムと自動で安全なソルトを使用するため、特別な設定が不要です。
ログイン時など、ユーザーが入力したパスワードの検証は、必ずpassword_verify関数で行ってください。ハッシュ化されたパスワードと入力パスワードを直接比較することは、セキュリティ上のリスクがあります。
password_get_info関数は、保存されたハッシュがどのようなアルゴリズムやオプション(計算コストなど)で生成されたかを確認するために活用します。これにより、現在のセキュリティ基準を満たしているか、将来的にpassword_needs_rehash関数と組み合わせて再ハッシュが必要かを判断できます。ハッシュの計算コストはセキュリティ強度に直結するため、適切な値を設定することが重要です。