日向夏特殊応援部隊

俺様向けメモ

堅牢なパスワードを強制するテクニック

やっぱりサービス側で堅牢なパスワードをユーザーに強制する仕組みが無いと問題があるサービスと言うのはたくさんあるって事で、Perlで出来る限り簡単にそういう仕組みを作れないかなと。

幾つかピックアップしてみました。

Data::Passwordモジュールを使う

真っ先にこれ。UNIX系OSでのパスワードの強度チェックと似たモジュールのようです。

use Data::Password qw(:all);

print IsBadPassword("hogehoge");

文字列が表示されちゃう場合はNGなパスワード。

このモジュールは辞書設定も出来るようです。

@Data::Password::DICTIONARIESに辞書ファイルを指定しておくとそこの内容も見てくれるみたい。
ありがちなパスワード集はftp://ftp.ox.ac.uk/pub/wordlists/に言語別にあります。

またUNIX系OSのようにユーザー名とのコンボもあります。

use Data::Password qw(:all);

print IsBadPasswordForUNIX("zigorou", "hogehoge");

Data::Password::Checkモジュールを使う (追記1: 2007-10-29T03:30:04+09:00)

このモジュールは結構使い勝手が良さそう。

use Data::Dump qw(dump);
use Data::Password::Check;

my $pwchk = Data::Password::Check->check({
  password => "hogehoge"
});

if ($pwchk->has_errors) {
  print dump($pwchk->error_list);
}

checkメソッド時に検証プロフィールを幾つか設定出来る模様。

String::Trigramモジュールを使う

livedoor Techブログ : String::Trigram でテキストの類似度を測るにヒントを得てなんですけど、ありがちなパスワードって、真っ先に挙がるのは

  • JOE
  • 自分のアカウント名+誕生日の数字
  • 自分のアカウント名の置換

とかなんですよね。つまりもとのアカウント名に似ているケースが多い。
って事は類似度が高いパスワードを計算してあげて、その閾値を超える物はNGみたいな判定してあげれば強固なパスワードになるんじゃないのかなと。

use String::Trigram;

print String::Trigram::compare("zigorou", "zigo1224");

結果は、

0.266666666666667

ちなみに完全一致が1です。

まとめ

  • ありがちな辞書アタックで引っかかるのはダメ
  • JOEダメ
  • 似すぎててもダメ

にさらに記号も入れなきゃダメって条件つけたら相当硬いパスワードなんじゃないすかねぇ。
覚えづらいけどもw

他にもたくさんありがちなケースがあるっちゃあるけど、サービス側でこうしたチェックをしてあげるのはやはりユーザーに対して親切じゃないかなと思うわけです。