« PERL5WEBDB で Movable Type デバッグ | メイン | C で tail に queue は不要 »

2006年06月23日

Captcha Plugin/ja について

 Ogawa::Memoranda さんが Captcha Plugin を公開されているということを知りました。

 どういう方式でやっているのかな、と思って拝見しました (きれいな構成だと思いました) が、MD5 の使い方に問題がありそうです。

 具体的に言うと、検証コード=MD5(CAPTCHA CODE) のように計算しているので、CAPTCHA CODE の MD5 値を予め計算しておくことで、任意の検証コードに対する正しい CAPTCHA CODE が判明してしまう、という点が問題です。

 CAPTCHA に使用されるのが5文字の英数字であれば、1G 弱のテーブルを用意すれば一瞬で解析できてしまします。
 また、Rainbow table のようなテクニックを使えば、より長い CAPTCHA CODE の場合でも解読することができるでしょう。

 所詮 CAPTCHA、と言ってしまえばそれまでですが、ソルトを使うといった改善が望ましいと、個人的には思います。

注: 36 とおり^5文字 * 16バイト

投稿者 kazuho : 2006年06月23日 12:49 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/662

コメント

その通りで辞書攻撃が可能です。

実は当初の実装ではSALTを使っていて、プラグインの設定画面でSALTの値もCaptchaの桁数も設定できるようにしてありました。ところがそうすると画像を生成するスクリプトでDBにアクセスしなくてはならなくなって相対的にオーバーヘッドが増加します。これにより逆に容易にDoS攻撃を許すことになります。これを回避するためのスロットリング機構を追加してもよいのですがまたオーバーヘッドを追加されることでしょう。

そういうわけで現状のCaptcha Pluginでは軽量だけれどリスクの大きめな実装をしています。

ここでの話はSALTや桁数のストアとしてMTのDBを使うことを前提にしています。この原則をブレークしてよいならもちろん奥さんの書いているような解決は容易ですね。

投稿者 (o) : 2006年06月23日 14:32

なるほど、事情が理解できました。ありがとうございます。

> 画像を生成するスクリプトでDBにアクセスしなくてはならなくなって相対的にオーバーヘッドが増加します。

それでは、MAC を使うようにして、初回実行時 (あるいは一定期間ごと) に秘密鍵を生成して(書き込み権限がある) キャプチャ画像等のディレクトリに保存するようにしてはいかがでしょう?

投稿者 kazuho : 2006年06月23日 15:19