堅牢なパスワードを強制するテクニック
やっぱりサービス側で堅牢なパスワードをユーザーに強制する仕組みが無いと問題があるサービスと言うのはたくさんあるって事で、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
他にもたくさんありがちなケースがあるっちゃあるけど、サービス側でこうしたチェックをしてあげるのはやはりユーザーに対して親切じゃないかなと思うわけです。