SEブログ
【PHP】入力したパスワードとハッシュ化したものを検証する
こんにちは!
データベースに入っているユーザーのパスワードがハッシュ化されている場合、ログインする際に、入力したパスワードとデータベースに格納されているハッシュ化されたパスワードを比較する必要があるかと思います。
ちなみにパスワードをハッシュで暗号化して登録する方法は以下の記事を参考にしていただければ幸いです。
PHP では、関数を使って入力されたパスワードとハッシュ化されたパスワードを検証する事ができますので、それを使うと良いでしょう。
password_verify — パスワードがハッシュにマッチするかどうかを調べる | PHP マニュアル
参考までに、備忘録も兼ねてコードを書いてみました。
前提として、データベースに以下のレコードが入っているとします。
user_id | ユーザー名 | パスワード (以下はハッシュ化されて登録されたものとします。) |
---|---|---|
1 | user | $2y$10$hd.tbyqys5oNQgYDiaK1TuiHjmuHHfBM946AEFEuZE8Nl.9mzPgmC |
スポンサーリンク
ログイン画面
<form action="" method="post" class="input-group"> <label for="username">ユーザー名 <input type="text" name="username" value=""> </label> <label for="password">パスワード <input type="password" name="password" value=""> </label> <button type="submit">ログイン</button> </form>
スポンサーリンク
ユーザー情報の登録処理
<?php $username = ''; $password = ''; $messages = array(); $err_msgs = array(); define('DB_HOST', 'localhost'); define('DB_USER', 'root'); define('DB_PASSWD', 'password'); define('DB_NAME', 'test'); define('DSN', 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8'); if ($_SERVER ['REQUEST_METHOD'] === 'POST') { if(isset($_POST[$username] === TRUE) { $username = $POST[$username]; } if(isset($_POST[$username] === TRUE) { $password = $POST[$password]; } } try { $pdo = new PDO(DSN, DB_USER, DB_PASSWD); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if (($_SERVER ['REQUEST_METHOD'] === 'POST') { $sql = ' SELECT username, password FROM user_table WHERE username = :username'; $stmt = $pdo->prepare($sql); $stmt->bindValue(':username',$username,PDO::PARAM_STR); $stmt->execute(); $row = $stmt->fetch(); $data = $row; } } catch(PDOException $e) { $err_msgs[] = 'DBに接続できませんでした。' . $e->getMessage(); } // 入力したパスワードとハッシュ化されたパスワードの検証 if (password_verify ($password, $data['password']) === TRUE) { // 指定したページにリダイレクトさせる header('Location: https://..../home.php'); exit(); } else { // エラー処理 } ?>
いかがでしょうか。
ハッシュ化されたパスワードは不可逆なので元に戻す事はできませんが、マッチしているかどうか検証する事はできます。
では最後までお読みいただきありがとうございました!