PHPメモ:パスワードの保存と認証
PHPでパスワードを保存する際ハッシュ化すればいいというのは理解したのですが、認証の仕方があっているかどうかわからなかったので調べました。
というのはパスワードの認証時、①フォームから送信された生のパスワードと、②ハッシュ化されデータベースに保存されたパスワードが存在します。この2つのパスワードは文字列が異なるので、どうやってパスワードが合っているか確認するんだろう?という疑問に至ったわけです。
調べた結果、難しく考えずpassword_verifyを使えば良さそう。
大まかな処理の流れ
- ユーザーが登録フォームからパスワードを送信する
- 送信されたパスワードの値が適切かどうかチェック
- パスワードをハッシュ化して変数に入れる
- データベースに保存する
- ユーザーがログインするときパスワードを認証する
ハッシュ化
ハッシュ化とは
任意の文字列を一定の計算手順に従って固定長の文字列に変換することです。簡単に言えば、パスワードをわかりにくくして悪質に利用されないようにすることです。
ハッシュ化したパスワードを元の文字列に戻すのは不可能です。そもそも元に戻すならハッシュ化する必要はないですね。
ハッシュ化する目的
セキュリティのため
パスワードが悪質なユーザーにバレてしまうとアカウントの情報が筒抜けになって乗っ取られてしまうので、セキュリティのためにパスワードをわからないようにすることは必須です。
データベースを操作する人に見られないようにするため
ユーザー以外にも開発、運用側の立場の人にパスワードがわからないようにするためにハッシュ化します。
ハッシュ化するための関数
パスワードをハッシュ化させるにはpassword_hashという関数を使います。返り値はハッシュ化されたパスワードです。関数を呼び出すたびに、返ってくる値は変わります。
使用例
アルゴリズム
パスワードをハッシュ化するための計算方法。とりあえずデフォルトのPASSWORD_DEFAULTを指定しておけばOKらしいです。
パスワードの認証
password_verifyという関数を使えばハッシュ化したパスワードを認証できます。
引数に指定した両方のパスワードが一致する場合trueが返ってきて、一致しない場合falseが返ってきます。送信された生のパスワードと保存されているハッシュ化されたパスワードを比較するので、生のパスワードを再びハッシュ化する必要はないです。
使用例
まとめ
ハッシュ化だけでなく、数回パスワードの入力に失敗したらログインできなくなるといった機能などもセキュリティのために必要ですね。
プログラミング勉強中で実務経験はまだないので、もし間違っている箇所があれば教えて頂けるとありがたいです。
参考
https://qiita.com/rana_kualu/items/3ef57485be1103362f56
https://www.php.net/manual/ja/function.password-hash.php