PHP ハッシュ化された値と通常の文字列を比較する

# 目的

- 文字列をハッシュ化する方法はすでにまとめた為、ハッシュ化された値と平文で入力された値がマッチするかの処理方法をまとめる
- ※ハッシュ化の方法について知りたい方はこちら→[PHP 値のハッシュ化を行う](https://qiita.com/miriwo/items/9f75d9544acbc40bb0a7)

# laravelで比較したい場合

- laravelで平文文字列とハッシュ化文字列を比較したい場合は下記をご参考に。。！
    - [laravel Hashされた文字列と平文を比較](https://qiita.com/miriwo/items/64bf32cd507d3699cb7f)

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いて導入 |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いて導入 |

- 上記環境にてLaravelアプリを作成し、そのアプリ名ディレクトリでコマンド`$ php artisan tinker`を実行し動作を確認した。

# 記載例

- 下記のリンク先を元に記載例をまとめる。
    - [password_verify](https://www.php.net/manual/ja/function.password-verify.php)

    ```php
    //マッチした場合trueが、マッチしなかった場合falseが出力される。
    password_verify(マッチを確認する平文, ハッシュ化された文字列);
    ```

# 具体例

1. 変数を使わない比較(筆者の説明が下手なため理解できなかったら飛ばしていただきたい)
    - 文字列「test」をアルゴリズム「PASSWORD_BCRYPT」でハッシュ化を行う。
    - ハッシュ化された文字列と通常の文字列がマッチしているか確認する処理を記載する。

        ```php
        //文字列「test」をハッシュ化する。出力されたハッシュのダブルクオートの中の文字列をコピーする
        password_hash('test', PASSWORD_BCRYPT);
        => "$2y$10$i628bxz4mvpT3TQzmV90juCtU0qMgnMagVuIt9Tao4mrPi4Y4oFl2"

        //ハッシュ化された値と通常の文字列の比較する。通常の文字列もハッシュ化された文字列もシングルクオートの中に記載する
        password_verify('マッチするか確かめたい通常の文字列', '$2y$10$i628bxz4mvpT3TQzmV90juCtU0qMgnMagVuIt9Tao4mrPi4Y4oFl2')

        //この一連の処理でtrueと表示させるには下記のようになる
        password_verify('test', '$2y$10$i628bxz4mvpT3TQzmV90juCtU0qMgnMagVuIt9Tao4mrPi4Y4oFl2')
        =>true
        ```
1. 変数を用いた比較
    - 文字列「test」をアルゴリズム「PASSWORD_BCRYPT」でハッシュ化を行う。
    - ハッシュ化された文字列と通常の文字列がマッチしているか確認する処理を変数を用いて記載する。

        ```php
        //文字列「test」をハッシュ化した値を変数「$hash」に格納する
        $hash = password_hash('test', PASSWORD_BCRYPT);

        //ハッシュ化された値と通常の文字列の比較する。通常の文字列はシングルクオートの中に記載する
        password_verify('マッチするか確かめたい通常の文字列', $hash)

        //この一連の処理でtrueと表示させるには下記のようになる
        password_verify('test', $hash)
        =>true
        ```
1. 変数を用いた比較(比較対象も変数)
    - ハッシュ化された文字列と通常文字列が格納された変数「$input_str」がマッチしているか確認する処理を変数を用いて記載する。

        ```php
        //文字列「test」をハッシュ化した値を変数「$hash」に格納する
        $hash = password_hash('test', PASSWORD_BCRYPT);

        //ハッシュ化された値と変数「$input_str」の比較する。通常の文字列はシングルクオートの中に記載する
        password_verify($input_str, $hash)
        ```
1. 「変数を用いた比較(比較対象も変数)」のコードを応用して出力を変更
    - 文字列「test」をアルゴリズム「PASSWORD_BCRYPT」でハッシュ化を行った値と変数「$input_str」に格納されている通常文字列が「test」であるかを確認する処理を記載する。
    - 変数「$input_str」に文字列「test」が格納されている場合、「ハッシュ化の値とマッチしました」と出力する。
    - 変数「$input_str」に文字列「test」意外が格納されている場合、「ハッシュ化の値とマッチしませんでした、別の値を試してください」と出力する。

        ```php
        //文字列「test」をハッシュ化した値を変数「$hash」に格納する
        $hash = password_hash('test', PASSWORD_BCRYPT);

        //マッチの評価を行う文字列を入力する、文字列はシングルクオートの中に
        $input_str = '任意の文字列を入力する';

        //分岐処理を記載する
        if (password_verify($input_str, $hash)) {
            echo 'ハッシュ化の値とマッチしました';
        }else{
            echo 'ハッシュ化の値とマッチしませんでした、別の値を試してください';
        }
        ```