PHPプロ!TIPS+

Crack関数でパスワードの安全度を確かめよう

セキュリティについて、みなさん開発者なら当然細心の注意を払って開発を行っているとは思います。しかし、システムを利用する側の多くのユーザは、システムをある程度信頼し、IDとパスワードがかかっていれば大丈夫などと思いがちです。

そのため、パスワードに覚えやすいものや、入力しやすいものを設定する人も多いのが現状です。しかし、そういった単純なパスワードは「ブルートフォースアタック」と呼ばれる、辞書ファイルなどからの総当り攻撃に非常に弱いといった問題があります。そこで、PHPのCrack関数の出番です。

Crack関数( http://www.phppro.jp/phpmanual/php/ref.crack.html )とは、PECLとして提供( http://pecl.php.net/package/crack )されており、パスワードの「強度」を試すためのCrackLib( http://sourceforge.net/projects/cracklib )ライブラリが使用可能となります。

ユーザがパスワードを設定する際に、パスワードの強度をチェックすることができます。

それでは、早速試してみたいと思います。今回の環境は、CentOS5、PHP5.1.6、crack-0.4となります。(CrackLibライブラリがインストールされていない方は、上記CrackLibのサイトからダウンロードしインストールしてください。)

まずは、crackモジュールのインストールです。PECLとして、提供されていますので、インストールはpeclコマンドで簡単に行えます。

$ pecl install crack

(しかし、今回の環境ではエラーがでてしまいましたので、以下の方法でインストールしました。)

$ pecl download crack
$ tar xvzf crack-0.4.tgz
$ cd crack-0.4
$ phpize
$ ./configure
$ make
$ make install

そして、crackモジュールをphp.iniで読み込むように設定します。

$ vi /etc/php.ini
extension=crack.so

apacheを再起動し、phpinfoで確認してみましょう。

phpinfoの内容

phpinfo

次にCrackLib用の辞書ファイルを用意します。英単語ファイルはyumでインストールできます。

yum install words.noarch

インストールした、wordsファイルから、CrackLib用の辞書ファイルを作成します。

$ create-cracklib-dict /usr/share/dict/linux.words


$ ls  /usr/share/cracklib/
cracklib.magic  pw_dict.hwm  pw_dict.pwd  pw_dict.pwi

これで、準備が整いました。

それでは、動作をマニュアルにあるサンプルスクリプトで試してみます。

<?php
// CrackLib 辞書をオープンする
$dictionary crack_opendict('/usr/share/cracklib/pw_dict')
     or die(
'Unable to open CrackLib dictionary');

// パスワードチェックを行う
$check crack_check($dictionary'password');

// メッセージを取得する
$diag crack_getlastmessage();
echo 
$diag;

// 辞書を閉じる
crack_closedict($dictionary);
?>

上記では、チェックする文字列を「password」としています。すると結果は「it is based on a dictionary word」と辞書ファイルに基づいた値だと、メッセージを返してくれます。

強度チェックによるメッセージ(crack_getlastmessageの戻り値)は、以下の9種類になります。

  • it’s WAY too short
  • it is too short
  • it does not contain enough DIFFERENT characters
  • it is all whitespace
  • it is too simplistic/systematic
  • it looks like a National Insurance number
  • it is based on a dictionary word
  • it is based on a (reversed) dictionary word
  • strong password

このように、簡単にパスワードの強度を判定することができます。

文字数制限などはよく見かけますが、こういった辞書の単語を使った強度チェックをしているところはあまり見かけません。弱いパスワードだからといって設定させないようにすると、ユーザの使い勝手が悪くなってしまうことがあるでしょう。

エラーとしてではなく、あくまでも警告程度で表示をしてあげるくらいの価値はあると思います。

システムを堅牢に作っているからこそ、ユーザにもある程度強度のあるパスワードを設定してもらうことが望まれます。ユーザに、セキュリティの意識を持たせる意味でも是非、利用してみてください。

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)