Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

PHP辞典

  1. トップページ
  2. PHP辞典
  3. password_hash() / password_verify()

password_hash() / password_verify()

パスワードを安全にハッシュ化し、検証するための関数です。ユーザー認証の実装に必須となるセキュリティ機能です。

構文
// パスワードをハッシュ化します。
password_hash($password, $algo, $options);

// パスワードとハッシュを検証します。
password_verify($password, $hash);

// ハッシュの再計算が必要かどうかを判定します。
password_needs_rehash($hash, $algo, $options);
関数一覧
関数概要
password_hash($password, $algo, $options)パスワードをハッシュ化して返します。同じパスワードでも毎回異なるハッシュが生成されます。自動的にソルトが付加されるため、手動でソルトを管理する必要はありません。
password_verify($password, $hash)平文パスワードがハッシュと一致するかを検証します。一致すれば『true』、不一致なら『false』を返します。
password_needs_rehash($hash, $algo, $options)既存のハッシュが現在のアルゴリズムやコスト設定と一致するかを判定します。『true』が返された場合は再ハッシュが必要です。
主なアルゴリズム定数
定数概要
PASSWORD_DEFAULTPHPが推奨するアルゴリズムを自動選択します。PHP 5.5〜7.x では bcrypt、PHP 8.x 以降も現時点では bcrypt です。将来的に変更される可能性があるため、ハッシュの保存カラムは255文字以上を確保してください。
PASSWORD_BCRYPTbcrypt アルゴリズムを使用します。常に60文字のハッシュを生成します。コストオプションでCPU負荷を調整できます。
PASSWORD_ARGON2IDArgon2id アルゴリズムを使用します。PHP 7.3 以降で利用可能で、bcrypt より新しいアルゴリズムです。
サンプルコード
<?php
// パスワードをハッシュ化します。
$password = "my_secure_password";
$hash = password_hash($password, PASSWORD_DEFAULT);
echo $hash; // 『$2y$10$...』のような60文字のハッシュが出力されます。

// 同じパスワードでも毎回異なるハッシュが生成されます。
$hash1 = password_hash($password, PASSWORD_DEFAULT);
$hash2 = password_hash($password, PASSWORD_DEFAULT);
var_dump($hash1 === $hash2); // 『bool(false)』と出力されます。ソルトが異なるためです。

// password_verify() でパスワードを検証します。
if (password_verify("my_secure_password", $hash)) {
	echo "認証に成功しました。";
} else {
	echo "パスワードが正しくありません。";
}

// ログイン処理の実装例です。
$input_password = $_POST['password'] ?? '';
$stored_hash = '$2y$10$abcdefghijklmnopqrstuuABCDEFGHIJKLMNOPQRSTUVWXYZ012'; // DBから取得したハッシュ

if (password_verify($input_password, $stored_hash)) {
	// 必要に応じてハッシュを再計算します。
	if (password_needs_rehash($stored_hash, PASSWORD_DEFAULT)) {
		$new_hash = password_hash($input_password, PASSWORD_DEFAULT);
		// DBのハッシュを $new_hash で更新します。
	}
	echo "ログイン成功";
} else {
	echo "ログイン失敗";
}

// コストオプションを指定する例です。
$options = ['cost' => 12]; // デフォルトは10。値が大きいほど安全だが処理が遅くなります。
$hash = password_hash($password, PASSWORD_BCRYPT, $options);
概要

『password_hash()』はPHPでパスワードを安全に保存するための標準関数です。自動的にランダムなソルトを付加し、bcrypt などの強力なアルゴリズムでハッシュ化します。パスワードの保存には必ず『password_hash()』を使用してください。『md5()』や『sha1()』でパスワードをハッシュ化することは絶対に避けてください。これらは高速すぎるため総当たり攻撃に対して脆弱です。

『password_verify()』はハッシュからソルトとアルゴリズムを自動的に読み取るため、検証時にソルトを別途管理する必要がありません。また、タイミング攻撃に対して安全な比較を行います。

『password_needs_rehash()』はアルゴリズムやコストの設定を変更した場合に、既存のハッシュを新しい設定で再計算すべきかどうかを判定します。ログイン成功時にこのチェックを入れておくと、セキュリティの向上をユーザーに意識させることなく段階的に移行できます。ハッシュ値の生成全般については『hash()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。