はじめに
パスワード認証では、ユーザーが入力した平文パスワードと、データベースに保存されたハッシュ化済みパスワードを比較する必要があります。しかし、ハッシュは一方向変換のため「そのまま比較」できません。このとき活躍するのが、password_verify()
関数です。
目次
🔍 実行コード
<?php
declare(strict_types=1);
error_reporting(-1);
$raw_password = 'password_exam';
$hash = password_hash($raw_password, PASSWORD_DEFAULT);
// 正しいパスワードを検証
$r = password_verify($raw_password, $hash);
var_dump($r);
// 間違ったパスワードを検証
$r = password_verify($raw_password . 'abc', $hash);
var_dump($r);
💡 実行結果
bool(true)
bool(false)
👉 この結果は「正しい」です。
なぜなら、password_verify()
は「平文を直接比較」するのではなく、保存されているハッシュのソルトとアルゴリズムを元に再ハッシュして照合しているからです。
🧠 処理の流れを図解で理解しよう
[ユーザー入力] [DBに保存されたハッシュ]
password_exam → $2y$10$PjVn5xkJg5hDqP0K...
↓ password_verify()
┌───────────────────────────────┐
│ ハッシュ内のソルトと方式を解析 │
│ 同じ条件で再ハッシュして比較 │
└───────────────────────────────┘
↓結果
一致 → true / 不一致 → false
🧩 関連関数まとめ
関数名 | 役割 |
---|---|
password_hash() | ソルト付きで安全なハッシュを生成(bcryptなど) |
password_verify() | 入力パスワードとハッシュを照合 |
password_needs_rehash() | 新しいアルゴリズムが推奨される場合に再ハッシュを促す |
🚀 まとめ
- パスワードを平文で保存してはいけない
password_hash()
で安全にハッシュ化password_verify()
で安全に照合- ハッシュは毎回異なる(ソルトがランダムだから)
- 出力結果が
bool(true)
bool(false)
となるのが正しい動作