【PHP8.x】password_hash関数の使い方

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

作成日: 更新日:

基本的な使い方

password_hash関数は、ユーザーのパスワードを安全に保存するために、不可逆なハッシュ値を生成する関数です。データベースなどにパスワードを平文のまま保存することは、セキュリティ上の重大なリスクを伴うため、この関数を用いてハッシュ化することが強く推奨されます。

この関数は、入力された平文のパスワードに対して、自動的にユニークな「ソルト」(salt)と呼ばれるランダムなデータを生成し、それをパスワードに付加してからハッシュ化を実行します。このソルトのおかげで、たとえ同じ平文のパスワードであっても、password_hash関数を複数回実行するたびに異なるハッシュ値が生成されます。これにより、辞書攻撃やレインボーテーブル攻撃といったパスワード解析の手法に対する耐性を大幅に高め、セキュリティを向上させることが可能です。

関数を使用する際は、第一引数にハッシュ化したい平文のパスワード文字列を、第二引数には使用するハッシュアルゴリズムを指定します。特に指定がない場合は、PHPが推奨する最も安全なアルゴリズムを自動的に選択する定数である PASSWORD_DEFAULT を使用することをお勧めします。また、オプションでハッシュ計算の負荷(コスト)を調整するパラメータも指定できますが、通常はデフォルト設定で十分な安全性を確保できます。

password_hash関数は、成功するとハッシュ化されたパスワード文字列を返します。この生成されたハッシュは、ユーザーがログインする際にパスワードを検証するために、password_verify() 関数と組み合わせて使用することが一般的です。これにより、平文のパスワードを知ることなく、入力されたパスワードが正しいかどうかを安全に確認することができます。

構文(syntax)

1<?php
2$password_to_hash = 'your_password_here';
3$hashing_algorithm = PASSWORD_DEFAULT; // PASSWORD_BCRYPT, PASSWORD_ARGON2ID など
4$options_array = []; // 例: ['cost' => 12]
5
6$hashed_password = password_hash($password_to_hash, $hashing_algorithm, $options_array);
7?>

引数(parameters)

string $password, string|int $algo, array $options = []

  • string $password: ハッシュ化するパスワードを指定する文字列
  • string|int $algo: 使用するハッシュアルゴリズムを指定する文字列または整数。デフォルトは PASSWORD_DEFAULT
  • array $options = []: ハッシュ化のオプションを指定する連想配列。利用可能なオプションはアルゴリズムによって異なります

戻り値(return)

string|false

ハッシュ化されたパスワード文字列、または処理に失敗した場合は false を返します。

サンプルコード

PHP password_hashでパスワードを安全にハッシュ化する

1<?php
2
3// ハッシュ化したい元のパスワードを定義します。
4$password = 'mySuperSecretPassword123!';
5
6// password_hash() 関数を使用してパスワードをハッシュ化します。
7// PASSWORD_DEFAULT は現在推奨される安全なハッシュアルゴリズム(例: bcrypt)を使用します。
8// これはPHPのバージョンアップに伴い、より強力なアルゴリズムに自動的に更新される可能性があるため、
9// 特定のアルゴリズムをハードコードするよりも推奨されます。
10// 第三引数のオプション配列で 'cost' (計算コスト) などを指定することも可能ですが、
11// PASSWORD_DEFAULT の場合は通常デフォルト値で十分です。
12$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
13
14// ハッシュ化が成功したかを確認します。
15// 失敗した場合は false が返されます。
16if ($hashedPassword !== false) {
17    echo "元のパスワード: " . $password . PHP_EOL;
18    echo "ハッシュ化されたパスワード: " . $hashedPassword . PHP_EOL;
19} else {
20    echo "パスワードのハッシュ化に失敗しました。PHPのエラーログを確認してください。" . PHP_EOL;
21}
22
23?>

PHPのpassword_hash関数は、ユーザーのパスワードを安全にデータベースなどに保存するために不可欠な機能を提供します。この関数は、元のパスワードを不可逆なハッシュ値に変換し、万が一データが漏洩しても元のパスワードが特定されにくいようにします。

サンプルコードでは、まず $password 変数にハッシュ化したい元のパスワードを定義しています。次に、password_hash() 関数を呼び出し、第一引数にこの $password を渡します。第二引数 $algo には、ハッシュアルゴリズムを指定しますが、PASSWORD_DEFAULT を使用することが強く推奨されます。これは、PHPが現在最も安全だと判断するアルゴリズムを自動的に選択し、将来のPHPバージョンアップでより強力なアルゴリズムへ自動的に更新されるため、常に最適なセキュリティレベルを保てる利点があるためです。第三引数 $options はオプションで、ハッシュ計算のコストなどを調整できますが、PASSWORD_DEFAULT の場合は通常デフォルト設定で十分です。

password_hash() 関数は、ハッシュ化に成功すると生成されたハッシュ文字列を返します。一方、何らかの理由で処理が失敗した場合は false を返します。そのため、サンプルコードのように $hashedPassword !== false で戻り値をチェックし、ハッシュ化が正常に行われたかを確認することが重要です。これにより、セキュアなパスワード処理が実現できます。

password_hash関数は、元のパスワードを復元できない一方向ハッシュを生成し、データベースなどにパスワードを安全に保存するための重要なセキュリティ機能です。認証時にはpassword_verify関数を使用してください。アルゴリズムにはPASSWORD_DEFAULTの利用を強く推奨します。これはPHPのバージョンアップに伴い、より安全なハッシュアルゴリズムに自動的に更新されるため、特定のアルゴリズムをハードコードするよりも将来にわたって堅牢です。関数が失敗した場合はfalseを返すため、必ず戻り値がfalseでないか確認し、適切にエラー処理を行うようにしてください。これにより、パスワードが確実にハッシュ化されていることを確認できます。

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

1<?php
2
3// ハッシュ化したい平文パスワードを定義します。
4$password = 'mySecurePassword123';
5
6// password_hash 関数を使ってパスワードをハッシュ化します。
7// 第二引数にはハッシュアルゴリズムを指定します。
8// PASSWORD_DEFAULT を使用すると、PHP が現在推奨する最も強力なアルゴリズムが自動的に選択されます。
9// 例: PHP 8.3時点では bcrypt (PASSWORD_BCRYPT) がデフォルトです。
10// この関数の戻り値は、ハッシュ化に成功した場合はハッシュ文字列、失敗した場合は false です。
11$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
12
13// password_hash の戻り値をチェックして、処理の成否を確認します。
14if ($hashedPassword === false) {
15    // ハッシュ化が失敗した場合の処理。
16    // 通常、リソース不足など予期せぬエラーが発生した場合に false が返されます。
17    echo "エラー: パスワードのハッシュ化に失敗しました。\n";
18} else {
19    // ハッシュ化が成功した場合の処理。
20    // 生成されたハッシュ文字列はデータベースなどに保存されます。
21    echo "パスワードのハッシュ化に成功しました。\n";
22    echo "生成されたハッシュ: " . $hashedPassword . "\n";
23}
24

password_hash関数は、ユーザーのパスワードを安全に保存するために使用される重要な関数です。平文のパスワードをそのままデータベースに保存することはセキュリティ上の大きなリスクとなるため、この関数を使ってパスワードを不可逆な「ハッシュ」という形式に変換します。

サンプルコードでは、'mySecurePassword123'という平文のパスワードをハッシュ化しています。第一引数にはハッシュ化したい平文のパスワード($password)を文字列として渡します。第二引数($algo)には、ハッシュ化に使用するアルゴリズムを指定します。PASSWORD_DEFAULTは、その時点のPHPが推奨する最も安全なアルゴリズムを自動的に選択するため、特別な理由がない限りこれを使用することが推奨されます。

この関数の戻り値は、ハッシュ化に成功した場合は生成されたハッシュ文字列となります。しかし、メモリ不足など何らかの予期せぬエラーが発生し、ハッシュ化が失敗した場合にはブール値のfalseが返されます。そのため、サンプルコードのようにif ($hashedPassword === false)で戻り値を必ずチェックし、処理が正常に完了したかを確認することが非常に重要です。成功したハッシュ文字列はデータベースなどに保存され、次回ログイン時のパスワード認証に利用されます。

password_hash関数の戻り値は、成功時にハッシュ文字列、失敗時にfalseです。このfalseが返された際の適切なエラー処理は非常に重要ですので、必ず戻り値の確認を行ってください。ハッシュアルゴリズムにはPASSWORD_DEFAULT定数を使用することを推奨します。これにより、PHPが推奨する最新の安全なアルゴリズムが自動的に選択され、将来のセキュリティ強化にも柔軟に対応できます。生成されるハッシュは元のパスワードよりも長くなるため、データベースに保存する際はVARCHAR(255)など十分な長さを確保してください。ハッシュは不可逆のため、平文に戻せません。ユーザー認証時には別途password_verify関数を利用し、平文パスワードをデータベースに直接保存することは絶対に避けてください。

関連コンテンツ