PHP
パスワード
PHP5
ハッシュ化

【PHP】パスワードをハッシュ化するプログラム

パスワードをハッシュ化するプログラム

今回は、PHP逆引きレシピを参考に、パスワードをハッシュ化するプログラムを作成します。

今回の記事を読めば、こんなものが作れます。↓
 2018-05-10 8.08.22.png

パスワードのハッシュ化をすると、例えば
japan
というパスワードが
$2y$10$mQj/zSQ.SgOW50oHI6GofeR.rrxljB1tkveLCvvyXF5BYNDMhSKG.
このようなハッシュ関数に変換されます。
このようにハッシュ関数に変換できるプログラムを今回は作成します。

*PHPの古いバージョン(5.5以前くらい)には対応していません。対応させるには別途プログラムを読み込む必要がありますが、今回は省略します。詳細はPHP逆引きレシピを読んでみてください

1.エスケープ処理をするプログラムを作成する

パスワードのハッシュ化をするプログラムを作成する前に、HTMLのエスケープ処理をする関数を作ります。
HTMLのエスケープ処理とは、特殊文字をブラウザに表示するために行うものです。

h.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>HTMLでのエスケープ処理をする関数</title>
</head>
<body>
<?php 

//HTMLでのエスケープ処理をする関数
function h($var) {
    // is_array() -> $varが配列かどうかを調べる
    // $varが配列だったら・・・
    if (is_array($var)) {
        // array_map() -> 配列の各要素に対して指定した関数を実行する
        // array_map('コールバック関数名',配列)
        return array_map('h', ($var));
    // $varが配列じゃなかったら・・・
    } else {
        // フォームなどからのユーザーのデータをブラウザに表示する場合は、
        // 原則すべてのデータにhtmlspecialchars関数を使用する。
        // ENT_QUOTES -> クオートを変換する
        return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
    }
}

?>
</body>
</html>

2.ハッシュ化するプログラムを作成する

ここから本題のプログラムです↓

hash_program.php
<?php 

//エスケープ処理をする関数を指定する
require_once 'h.php';

if (isset($_POST['submit'])) {
    $password = $_POST['password'];

    // ハッシュ処理の計算コストを指定。ソルトは自動生成とする
    // ハッシュ処理の計算コストとは、
    // 連想配列:costという引き出しの中に、10を格納する
    $options = array('cost' => 10);

    //  ハッシュ化方式にPASSWORD_DEFAULTを指定し、パスワードをハッシュ化する
    // password_hash -> パスワードハッシュを作る
    // $password -> ユーザーのパスワード
    // PASSWORD_DEFAULT -> パスワードのハッシュに使うアルゴリズム
    // $options -> オプションを含む連想配列
    $hash = password_hash($password, PASSWORD_DEFAULT, $options);
}

 ?>

 <!DOCTYPE html>
 <html lang="ja">
 <head>
    <meta charset="UTF-8">
    <title>ハッシュ化済みパスワードを取得するスクリプト</title>
 </head>
 <body>
<?php 

// $hashが入力されたら・・・
if (isset($hash)) {
    echo '生パスワード:'.h($password).'<br>';
    echo 'ハッシュ化済みパスワード:'.h($hash).'<br>';
}

// パスワードがハッシュにマッチするか調べる
// $password -> ユーザーのパスワード
// $hash -> password_hash()が作ったハッシュ
$auth = password_verify($password, $hash);

//もし$authがtrueだったら・・・
if ($auth) {
    echo "yay!!!パスワードがハッシュにマッチしています!";
} else {
    echo "パスワードがハッシュにマッチしていません";
}

 ?>
 <hr>

 <form action="password_hash.php" method="post">
    <label for="password">ハッシュ化したいパスワード文字列:</label>
    <input type="text" name="password" id="password" value="">
    <input type="submit" name="submit" value="ハッシュ化">
 </form>
 </body>
 </html>

以上です。

参考文献

PHP逆引きレシピ