SEブログ

【PHP】入力したパスワードとハッシュ化したものを検証する

こんにちは!

 

データベースに入っているユーザーのパスワードがハッシュ化されている場合、ログインする際に、入力したパスワードとデータベースに格納されているハッシュ化されたパスワードを比較する必要があるかと思います。

 

ちなみにパスワードをハッシュで暗号化して登録する方法は以下の記事を参考にしていただければ幸いです。

【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 {
  
        // エラー処理
    }

?>

 

 

いかがでしょうか。

ハッシュ化されたパスワードは不可逆なので元に戻す事はできませんが、マッチしているかどうか検証する事はできます。

 

 

では最後までお読みいただきありがとうございました!