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

PHP

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

2018年5月21日

こんにちは!

 

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

 

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

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

?>

 

 

いかがでしょうか。

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

 

 

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

  • この記事を書いた人

そーまん

セキュリティエンジニアやってます。
ブログ歴3年。PVは月15万PV程度。
趣味はボクシング、筋トレ、登山です。
穏やかで人見知りでマイペースな人です。

人気記事

1

こんにちは!SE ブログの相馬です。       今回は、PC に適用されている GPO を確認する方法について書きました。     グループポリシー ...

2

こんにちは!SE ブログの相馬です。       今回は sysprep について、全体的に PC をセットアップする観点から書いてみました。長々と書いてあります。まずは ...

3

こんにちは!SE ブログの相馬です。       今回は、グループポリシーを使って、特定のコンピューターに対して、ドメインユーザーに Administrators 権限を ...

4

こんにちは!SE ブログの相馬です。       今回は、Windows サインイン後に一時ユーザープロファイルが読み込まれてしまった場合の解決方法について書きました。 ...

5

こんにちは!SEブログの相馬です。       今回は、ユーザープロファイルを削除する方法について書いてみました。     1 台の PC を複数人で ...

6

こんにちは!SE ブログの相馬です。       今回は、繰り返し文について書いてみました。PowerShell では他のプログラミング言語同様、繰り返し処理を行うことが ...

7

コマンドを使って CPU とメモリの使用率をデータで取得してみましたので、例えば PC のトラブルシューティングで問題を再現させる際にデータを取得しておくと、原因の特定に役立つ場合があるかと思います。

8

既存の PC と同じ構成で別のメーカーの PC でマスターイメージを作る際、インストールされているアプリを同一にする為に必要になるかと思います。

9

企業で多くの GPO が適用されている環境では、PC に GPO が適用されなかったりする問題が発生する場合があるかと思います。その中でも、コンピューターの構成またはユーザーの構成のどちらかで、...

10

こんにちは!SE ブログの相馬です。       今回は、Windows Server 2016 で NTP サーバーと同期する方法について書きました。   & ...

-PHP
-,