Webセキュリティの小部屋

Twitter のフォローはこちらから Facebook ページはこちら Google+ページはこちら RSSフィードのご登録はこちらから
公開日:2015年11月12日
最終更新日:2015年11月13日

Web アプリケーションのパスワード保存ロジック変更に対応可能な実装方法

はじめに

Web アプリケーションでは、パスワードを、ソルト+ハッシュ化+ストレッチングの手法で安全に保存されていると思います。もし、こうしたパスワードの保存方法を行っていない場合は、早急にパスワードの保存方法を改善することをお勧めします。パスワードが漏洩して信用を失ってからでは遅いですからね。

パスワードの安全な保存方法は、以下の記事を参考にしてください。PHP, Java, C#, VB.NET の実装サンプルもあります。

さて、ハッシュ方式として、MD5 と SHA1 がありますが、今はもう危殆化(安全ではなくなる)してしまって、使用するのにはよろしくありません。

ですが、既存のシステムではこのハッシュ方式を使用しているケースも多いと思います。では、こういった既存システムや、今後のシステムではどうすればよいのでしょうか?

それは、パスワードの保存方法にバージョンを付与して判断・更新することです。これにより、ユーザーのパスワードは最新の方式で、安全に保存することができます。

この記事では、この実装方法をご紹介します。

PHP + PDO + MySQL (CentOS 7) で動作検証していますが、理屈は他の言語でも同じなので参考になると思います。

設計イメージ

Test データベースに、以下のような USERS テーブルを作成します。

VERSION フィールドはパスワード保存ロジックのバージョンを保存します。

現在のパスワード保存ロジックのバージョン番号を、PHP の設定ファイルに保存しておきます。そして、ログイン時、ユーザーの VERSION フィールドと、設定ファイルのバージョン番号が異なる場合は、VERSION, SALT, PASSWORD を最新のものに更新します。以降は、新しいパスワード保存ロジックでログインするようにします。

PHP のファイルは以下の4種類用意します。

function.php 共通設定ファイル
login.php ログイン画面
login_check.php ログインチェック
welcome.php ログイン後画面

サンプルコード

・function.php

・login.php

・login_check.php

・welcome.php

解説

ほぼコードを見たままなので、細かい解説はあまり必要ないかと思いますが、パスワード保存ロジックのバージョンが変わった場合は、function.php の PASSWORD_VERSION 定数をカウントアップし、get_password 関数をアップデートします。

これで、パスワード保存ロジックが変更になっても、自動的にパスワード保存ロジックが最新のデータに反映されるようになります。

但し、ログインしないユーザーはデータが更新されないので、リセットフラグを設定して、一定期間経過後パスワードが変更されないユーザーには、ログイン依頼メールを送信するというのが現実的な対応でしょう。

なお、PHP 5.5.0 からは、これらの処理を自動で行ってくれる password-hash 関数があるので、こちらの使用がいろいろなサイトで推奨されています。

ただ個人的には、面倒でもこの記事にある方法で対応した方が柔軟性が高くてよいのではないかと考えています。言語も関係ありませんし、ストレッチングの回数を増やすといった対応もできますし。

おわりに

PHP + PDO + MySQL で、Web アプリケーションのパスワード保存ロジック変更時に対応が可能な実装方法を見てきましたが、いかがだったでしょうか。テーブルにバージョンフィールドを追加するだけで、思ったより簡単に対応できることが分かります。

ですので、現在パスワードの保存方法に不安がある方は、 こういう簡単な方法があるということで安全なパスワード保存方法へ移行するとよいかと思います。

 

参考


スポンサーリンク




カテゴリー:ブログ

Twitter でも、いろんな情報を発信しています。



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA