PHPのpassword_hashを完全ガイド!初心者でもわかる安全なパスワードの保存方法
生徒
「PHPでログイン機能を作りたいのですが、ユーザーのパスワードってどうやって安全に保存すればいいんでしょうか?」
先生
「PHPにはpassword_hashという安全なパスワード保存の仕組みがあります。これを使えば、パスワードが盗まれる危険を大幅に減らせますよ。」
生徒
「パスワードをそのまま保存するのは危険だと聞いたことがあります。どうしてなんですか?」
先生
「では、PHPでパスワードを安全に保存する方法を基本から一緒に見ていきましょう。」
1. なぜパスワードを生のまま保存してはいけないのか?
初心者の人が最初に疑問に思うのが「パスワードをそのまま保存してはいけない理由」です。パスワードを平文のまま保存すると、もしデータベースが盗まれたときに全てのパスワードがそのまま見えてしまいます。これは、鍵のかかっていない引き出しに大切な書類を入れておくのと同じで、誰でも簡単に覗けてしまう状態です。
Webサービスが増えるにつれて、不正アクセスやデータ漏洩は年々増えています。パスワードが漏れてしまうと、他のサービスに同じパスワードを使っている人の場合、連鎖的にアカウントが乗っ取られる危険性もあります。そのため、PHPではpassword_hashという強力な関数を使ってパスワードを安全に変換して保存します。
2. password_hashとは?初心者でも理解できるように解説
password_hashとは、ユーザーが入力したパスワードを特殊な計算方法で変換し、元に戻せない形にするPHPの関数です。専門的には「ハッシュ化」と呼ばれていますが、ここでは“パスワードを溶かして形が変わった状態にする”イメージでOKです。一度ハッシュ化されると、元のパスワードには戻せません。
ポイントは、ハッシュ化されたパスワードは毎回違う値になるということです。これは同じ砂糖の塊を溶かしても毎回微妙に形が違うようなものです。このおかげで、攻撃者は元のパスワードを推測しにくくなり、辞書攻撃や総当たり攻撃などにも強くなります。
$password = "mypassword";
$hash = password_hash($password, PASSWORD_DEFAULT);
echo $hash;
3. password_verifyで正しいパスワードかどうか確認する
パスワードを保存するときはpassword_hashを使いますが、ログイン時にはユーザーが入力したパスワードと保存されているハッシュが一致するか確認する必要があります。そこで使うのがpassword_verifyです。これは、元のパスワードを直接比較するのではなく、PHPが内部で専用の仕組みを使って照合してくれます。
例えるなら、鍵穴(ハッシュ値)に対してユーザーが持っている鍵(パスワード)が合うかどうかの確認をPHPが自動で行うようなイメージです。鍵そのもの(パスワード)を直接保存しないので安全性が保たれています。
if (password_verify($password, $hash)) {
echo "ログイン成功";
} else {
echo "ログイン失敗";
}
4. ハッシュ関数と暗号の違いを初心者にもわかる形で説明
初心者が混乱しやすいポイントに「暗号化とハッシュ化の違い」があります。暗号化は鍵を使えば元に戻せますが、ハッシュ化は元に戻せません。もし暗号化したパスワードを保存していた場合、鍵が盗まれれば全てのパスワードが復元できてしまうため危険です。
そのため、PHPでは「戻せない形に変換するハッシュ化」が推奨されています。password_hashは内部で安全なアルゴリズムを使ってハッシュ化してくれるので、初心者でも簡単に安全な仕組みを使えます。
5. なぜpassword_hashを使うと安全なのか?
password_hashが安全な理由は、内部で「ソルト」と呼ばれるランダムな値を自動的に付与してくれるからです。ソルトとは、同じパスワードでも異なる結果にするための追加の成分のようなものです。例えば、同じ料理を何度作っても、少し塩加減を変えるだけで味が変わるイメージです。
この仕組みにより、攻撃者がよく使われるパスワードのリストを用意して照合する「レインボーテーブル攻撃」も無効化できます。また、PASSWORD_DEFAULTを使っておけば、PHPが推奨する安全なアルゴリズムに自動的に切り替わるため、特別な知識がなくても安全性を保てます。
6. データベースに保存するときの注意点
実際にユーザー登録機能を作る際には、ハッシュ化したパスワードをデータベースに保存します。保存するのはあくまでハッシュ値であり、生のパスワードは絶対に保存してはいけません。データベースが盗まれたとしても、ハッシュ化されたパスワードであれば簡単には元に戻らないため安全性が高まります。
さらに、ログイン処理の際にはpassword_verifyを使って照合するだけなので、初心者でも安全な仕組みを実装しやすい点も大きなメリットです。現代のWebセキュリティでは、password_hashは必須の機能と言えます。