【PHP】パスワードをハッシュで暗号化する

PHP

【PHP】パスワードをハッシュで暗号化する

2018年5月21日

こんにちは!

 

ユーザー登録画面を作って思ったのですが、ユーザー情報を入力して登録した後で、入力したパスワードが DB に保存される時に、そのままの状態で保存されてしまうのはセキュリティー的に考えると非常にリスクが高いかと思います。

 

例えば、データベースに攻撃を受けたときに、登録されているパスワードが全て盗まれた時に、パスワードがそのままですと、ユーザーアカウント名さえ分かれば簡単にログインできてしまいます。

 

ですので、パスワードの暗号化は非常に重要です。

PHP では、関数を使って入力されたパスワードを暗号化する事ができますので、それを使うと良いでしょう。

但し、これはあくまでもデータベースへの攻撃対策の為になります。以下に PHP マニュアルを引用させていただきました。

 

安全なパスワードハッシュ | PHP マニュアル

 

しかし、ここで注意すべき点は、パスワードのハッシュ処理はあくまでもデータベースへの不正アクセスからの保護にすぎず、 アプリケーション自体に不正なコードを注入される攻撃からは守れないということです。

 

 

参考までに、備忘録も兼ねてコードを書いてみました。

 

 

ユーザー登録画面

 

 

<form action="" method="post">
    <label for="username">ユーザー名
        <input type="username" name="username" value="">
    </label>
    <label for="password">パスワード
        <input type="password" name="password" value="">
    </label>
    <input type="submit" value="送信">
</form>

 

 

ユーザー情報の登録処理

 

<?php

    $username = '';
    $password = '';
    $messages = array();
    $err_msgs = array();
        
    // DB接続情報
    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');

    // POST処理 
    if ($_SERVER ['REQUEST_METHOD'] === 'POST') {
        if(isset($_POST[$username] === TRUE) {
            $username = $POST[$username];
        }
        if(isset($_POST[$username] === TRUE) {
            $password = $POST[$password];
        }
    }
    // DBに接続し、POST処理でエラーが無ければパスワードをハッシュ化し、クエリを実行します。
    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') && count($err_msgs) === 0) {

            // ここで、password_hash 関数を使って、$hash 変数に代入してます。
            $hash = password_hash ($password, PASSWORD_DEFAULT);

            $sql = '
            INSERT INTO user_table(
             username,
             password
            VALUES( :username, :password )';
            $stmt = $pdo->prepare($sql);
            $stmt->bindValue(':username',$username,PDO::PARAM_STR);
            $stmt->bindValue(':password',$hash,PDO::PARAM_STR);
            $stmt->execute();
            
            $messages[] = '登録に成功しました。
        } catch(PDOException $e) {

            $err_msgs[] = 'DBに接続できませんでした。' . $e->getMessage();

        }
    }
?>

 

 

いかがでしょうか。最低限、データーベースに入っているパスワードは暗号化する事は必要だと思います。

 

この他にも、ログイン時に入力したパスワードと、一旦データベースにハッシュ化されたパスワードを比較する事もできます。

これは、password_verity という関数でできますので、調べてみると良いでしょう。

 

一応、記事も書いておきました。

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

 

 

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

  • この記事を書いた人

そーまん

セキュリティエンジニアやってます。
ブログ歴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
-,