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の内容
次に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は、毎週金曜日に更新され、新しい記事が掲載されます。






ページのトップへ


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