Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】PASSWORD_DEFAULT定数の使い方

PASSWORD_DEFAULT定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

PASSWORD_DEFAULT定数は、PHPでパスワードをハッシュ化する際に、現在推奨されるデフォルトのアルゴリズムを表す定数です。

この定数は、Webアプリケーションでユーザーパスワードを安全にデータベースへ保存するために利用されます。パスワードの平文保存はセキュリティリスクが高いため、一方向のハッシュ値に変換することが必須です。PASSWORD_DEFAULTを使うことで、開発者はアルゴリズムを意識せず常に最新かつ最も安全な方法を利用でき、PHPのバージョンアップでアルゴリズムが変更されてもコード変更なしで自動対応し、長期的なセキュリティを維持できます。

具体的な利用方法は、password_hash()関数と組み合わせます。password_hash('ユーザーのパスワード', PASSWORD_DEFAULT); のように記述することで、パスワードは推奨されるデフォルトアルゴリズム(PHP 8ではbcrypt)でハッシュ化され、ユーザーログイン時の認証に使用されます。

Webアプリケーションのセキュリティにおいて、PASSWORD_DEFAULTを活用した適切なパスワードハッシュ化は極めて重要であり、ベストプラクティスです。

構文(syntax)

1<?php
2$password = 'mypassword';
3$hashedPassword = password_hash($password, PASSWORD_DEFAULT);

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP PASSWORD_DEFAULT でパスワードをハッシュ化する

1<?php
2
3/**
4 * プレーンテキストのパスワードをハッシュ化し、そのハッシュを検証するサンプル関数。
5 *
6 * PASSWORD_DEFAULT 定数を使用して、現在推奨されている強力なハッシュアルゴリズムでパスワードをハッシュ化します。
7 * システムエンジニアを目指す初心者向けに、パスワードの安全な取り扱い方の基本を示します。
8 *
9 * @param string $plainTextPassword ハッシュ化および検証するプレーンテキストのパスワード
10 * @return void
11 */
12function generateAndVerifyPasswordHash(string $plainTextPassword): void
13{
14    echo "--- パスワードハッシュの生成と検証の例 ---\n\n";
15
16    // 1. PASSWORD_DEFAULT を使用してパスワードをハッシュ化します。
17    //    PASSWORD_DEFAULT は、PHP が現在推奨する最も安全なハッシュアルゴリズム(例: bcrypt)を使用します。
18    //    将来的にセキュリティが向上した新しいアルゴリズムが登場した場合、この定数を使用していれば
19    //    PHP のバージョンアップで自動的に更新される可能性があります。
20    $hashedPassword = password_hash($plainTextPassword, PASSWORD_DEFAULT);
21
22    if ($hashedPassword === false) {
23        echo "エラー: パスワードのハッシュ化に失敗しました。\n";
24        return;
25    }
26
27    echo "元のパスワード: " . $plainTextPassword . "\n";
28    echo "ハッシュ化されたパスワード: " . $hashedPassword . "\n\n";
29
30    // 2. ハッシュ化されたパスワードを元のパスワードと比較して検証します。
31    //    これは、ユーザーがログイン時に入力したパスワードとデータベースに保存されたハッシュを比較する際に使用されます。
32    $isValid = password_verify($plainTextPassword, $hashedPassword);
33
34    if ($isValid) {
35        echo "検証結果: 提供されたパスワードはハッシュと一致します。\n";
36    } else {
37        echo "検証結果: 提供されたパスワードはハッシュと一致しません。\n";
38    }
39
40    echo "\n-------------------------------------\n";
41
42    // 意図的に間違ったパスワードでの検証例
43    $wrongPassword = "wrong_password";
44    echo "不正なパスワード ('" . $wrongPassword . "') での検証:\n";
45    $isWrongPasswordValid = password_verify($wrongPassword, $hashedPassword);
46    if ($isWrongPasswordValid) {
47        echo "検証結果: (誤) 不正なパスワードが一致しました。\n";
48    } else {
49        echo "検証結果: 不正なパスワードはハッシュと一致しません。\n";
50    }
51}
52
53// サンプル関数の実行
54generateAndVerifyPasswordHash("MySecurePassword123!");
55

このサンプルコードは、システムエンジニアを目指す初心者が理解すべきパスワードの安全な取り扱い方として、パスワードのハッシュ化とその検証方法をPHPで示しています。PASSWORD_DEFAULTは、PHPが現在推奨する最も安全なハッシュアルゴリズム(例えばbcrypt)を指定するための定数です。この定数を使用することで、セキュリティが向上した新しいアルゴリズムが将来的に登場した場合でも、PHPのバージョンアップで自動的に対応できる可能性があります。

generateAndVerifyPasswordHash関数は、引数として受け取ったプレーンテキストのパスワードをpassword_hash関数とPASSWORD_DEFAULTを使ってハッシュ化します。ハッシュ化とは、元のパスワードを特定されにくい一方向の文字列に変換することです。これにより、データベースにパスワードが保存される際も、直接元の文字列を保存するのではなく、ハッシュ化された文字列を保存することで安全性を高めます。

その後、password_verify関数を使用して、入力されたパスワードがハッシュと一致するかどうかを検証します。これは、ユーザーがログインする際などに、入力されたパスワードとデータベースに保存されたハッシュ化されたパスワードを比較する仕組みです。サンプルコードでは、正しいパスワードでの検証と、意図的に間違ったパスワードでの検証の両方を行い、それぞれの結果を出力しています。generateAndVerifyPasswordHash関数は文字列型のパスワードを引数に取りますが、戻り値は特にありません。画面への出力によって処理結果を示します。

このコードは、パスワードを平文で保存する危険性を避け、安全にハッシュ化する基本を示しています。PASSWORD_DEFAULT定数は、PHPが推奨する最新かつ強力なハッシュアルゴリズムを自動的に利用し、ソルトも内部で生成されるため、開発者はセキュリティの詳細を常に追う必要が少なく便利です。password_hash関数がエラーでfalseを返す可能性があるため、その際の適切なエラー処理は必ず実装してください。ハッシュ化されたパスワードの検証には、必ずpassword_verify関数を使用し、文字列として直接比較することは絶対に避けてください。これらの手順は、データベースが侵害された際のパスワード漏洩リスクを最小限に抑えるための、非常に重要なセキュリティ対策です。

PHPパスワードハッシュ:PASSWORD_DEFAULTとPASSWORD_BCRYPTの比較

1<?php
2
3/**
4 * PASSWORD_DEFAULT と PASSWORD_BCRYPT を用いたパスワードハッシュ化の比較と検証を行います。
5 *
6 * PASSWORD_DEFAULT は、PHP が現在推奨するハッシュアルゴリズムを示す定数です。
7 * PHP 8 の時点では PASSWORD_BCRYPT と同じアルゴリズム (Bcrypt) を指しますが、
8 * 将来の PHP バージョンで、より強力なアルゴリズムが登場した際にはその値が変更される可能性があります。
9 * これにより、アプリケーションコードを変更することなく、常に最新かつ最も安全なハッシュアルゴリズムを使用できます。
10 */
11function comparePasswordHashingAlgorithms(): void
12{
13    $password = 'myStrongSecretPassword123!';
14
15    echo "元のパスワード: " . $password . PHP_EOL . PHP_EOL;
16
17    // PASSWORD_DEFAULT を使用してパスワードをハッシュ化
18    // PHPが推奨する現在のデフォルトアルゴリズム (PHP 8ではBcrypt) を使用します。
19    $hashedPasswordDefault = password_hash($password, PASSWORD_DEFAULT);
20    echo "PASSWORD_DEFAULT でハッシュ化: " . $hashedPasswordDefault . PHP_EOL;
21
22    // PASSWORD_BCRYPT を明示的に使用してパスワードをハッシュ化
23    // bcryptアルゴリズムを直接指定します。
24    $hashedPasswordBcrypt = password_hash($password, PASSWORD_BCRYPT);
25    echo "PASSWORD_BCRYPT でハッシュ化: " . $hashedPasswordBcrypt . PHP_EOL . PHP_EOL;
26
27    // 定数の値が同じであることを確認
28    // PHP 8では、PASSWORD_DEFAULT は PASSWORD_BCRYPT と同じ整数値を持ちます。
29    echo "PASSWORD_DEFAULT の定数値: " . PASSWORD_DEFAULT . PHP_EOL;
30    echo "PASSWORD_BCRYPT の定数値: " . PASSWORD_BCRYPT . PHP_EOL;
31    echo "PHP 8 において PASSWORD_DEFAULT は PASSWORD_BCRYPT と同じ値か? " . (PASSWORD_DEFAULT === PASSWORD_BCRYPT ? 'はい' : 'いいえ') . PHP_EOL . PHP_EOL;
32
33    // ハッシュの検証
34    echo "--- パスワードハッシュ検証 ---" . PHP_EOL;
35
36    // PASSWORD_DEFAULT で生成されたハッシュを検証
37    if (password_verify($password, $hashedPasswordDefault)) {
38        echo "  PASSWORD_DEFAULT で生成されたハッシュ: 検証成功" . PHP_EOL;
39    } else {
40        echo "  PASSWORD_DEFAULT で生成されたハッシュ: 検証失敗" . PHP_EOL;
41    }
42
43    // PASSWORD_BCRYPT で生成されたハッシュを検証
44    if (password_verify($password, $hashedPasswordBcrypt)) {
45        echo "  PASSWORD_BCRYPT で生成されたハッシュ: 検証成功" . PHP_EOL;
46    } else {
47        echo "  PASSWORD_BCRYPT で生成されたハッシュ: 検証失敗" . PHP_EOL;
48    }
49
50    // 間違ったパスワードでの検証例
51    $wrongPassword = 'incorrect_password';
52    if (!password_verify($wrongPassword, $hashedPasswordDefault)) {
53        echo "  間違ったパスワード ('" . $wrongPassword . "') の検証 (DEFAULT): 失敗 (期待通り)" . PHP_EOL;
54    } else {
55        echo "  間違ったパスワード ('" . $wrongPassword . "') の検証 (DEFAULT): 成功 (これはエラー)" . PHP_EOL;
56    }
57
58    echo PHP_EOL;
59    echo "【まとめ】" . PHP_EOL;
60    echo "  パスワードハッシュには password_hash() と password_verify() を使用し、" . PHP_EOL;
61    echo "  特に password_hash() のアルゴリズム指定には PASSWORD_DEFAULT を使うことが推奨されます。" . PHP_EOL;
62    echo "  これにより、将来のPHPバージョンアップ時に自動的に最新の推奨アルゴリズムに追従でき、" . PHP_EOL;
63    echo "  セキュリティを維持しやすくなります。" . PHP_EOL;
64}
65
66// 関数の実行
67comparePasswordHashingAlgorithms();
68
69?>

PHPのPASSWORD_DEFAULTは、パスワードを安全に保存するために推奨されるハッシュアルゴリズムを示す定数です。この定数自体に引数や戻り値はありません。PHP 8の時点では、PASSWORD_BCRYPT定数が指すBcryptアルゴリズムと同じアルゴリズムを表していますが、将来のPHPバージョンでより強力なアルゴリズムが登場した際には、その値が自動的に更新される可能性があります。

サンプルコードでは、ユーザーのパスワードをハッシュ化するpassword_hash()関数と、ハッシュ化されたパスワードと入力されたパスワードが一致するか検証するpassword_verify()関数の使い方を比較しながら説明しています。password_hash()関数は、元のパスワードと使用するハッシュアルゴリズムを示す定数を引数にとり、セキュリティを強化したハッシュ文字列を戻り値として返します。一方、password_verify()関数は、検証対象のパスワードと既にハッシュ化されたパスワードを引数にとり、両者が一致すれば真(true)、一致しなければ偽(false)を戻り値として返します。

PASSWORD_DEFAULTpassword_hash()関数に指定してパスワードをハッシュ化することで、将来PHPがバージョンアップして新しい推奨アルゴリズムが導入されても、アプリケーションのコードを修正することなく、常に最新かつ最も安全な方法でパスワードを処理し続けることができます。これにより、システムのセキュリティ維持が容易になります。このため、新しいアプリケーション開発ではPASSWORD_DEFAULTの使用が強く推奨されます。

PASSWORD_DEFAULTは、PHPが現在最も安全と推奨するパスワードハッシュアルゴリズムを示す定数です。PHP 8ではPASSWORD_BCRYPTと同じBcryptアルゴリズムを指しますが、将来のPHPバージョンでより強力なアルゴリズムが登場した場合、PASSWORD_DEFAULTの値は自動的に更新されます。これにより、コードを変更することなく常に最新のセキュリティ基準を維持できる点が最大のメリットです。パスワードのハッシュ化には必ずpassword_hash()を、検証にはpassword_verify()をセットで使用してください。同じパスワードでもpassword_hash()の出力は毎回異なるため、ハッシュ値同士を直接比較してはいけません。将来のセキュリティ強化に自動的に対応するため、アルゴリズム指定にはPASSWORD_DEFAULTを使用することが強く推奨されます。

関連コンテンツ