サーバーを自由に弄れない環境でのセッションID生成
2006-06-20


あらまし

頼まれ仕事なのですが、こんな感じの Web スペース上で、「管理者だけが閲覧できるページ」を含む Web アプリを実現せなあかんちうことになりまして、もちろん基本認証とかも使えないので、CGI だけで認証機構を用意しないといけないのですが、その実現方法をどうしようかなぁというお話。

実は、既にプログラムは Perl で途中まで組まれていて、認証機構の実現で幾分か行き詰っている状態なのであります。重要なのは、信頼性の高いハッシュ関数と、暗号理論上安全な乱数の生成であり、これらは Perl の場合、前者は Digest::SHA[LINK] かもしくは MD5[LINK]、後者は Math::TrulyRandom[LINK] といったモジュールを追加してあげれば確実に実現可能なわけですが、自分で設定できるサーバーを使うわけではないため、これらのモジュールを組み込んで使うことは不可能だったりするわけです。

# gcc をサポート、とあるので、各モジュールのソースをダウンロードして make まではできるのかもしれないけどね。それができれば CGI プログラムと同じ場所においておくことでとりあえず動かすことはできるけど。。。そもそも telnet や ssh が使えるわけでもないのにどうやって make を走らせるんだろう?

んで、一体どうしたもんかなぁという辺りをぐだぐだと考えてみるテストなのです。

ハッシュ関数

PHP3 が使えるので、PHP の md5()[LINK] 関数を使うという手がある。Perl から PHP の関数を利用するには、例えばこんな風に書けばいいんじゃないかな。

my $digest = `php -r 'echo md5("$text");'`;

むしろプログラム自体を PHP で書け、という話もあるのですが。。。まぁ拡張子を「.php3」にすれば確かに PHP3 環境のテストもできるけどさぁ。

PHP を外から使うのがまどろっこしいと思うのであれば、あとは crypt 関数を利用する、という手もある。この手の無料 Web スペースや安価なレンサバなんかの場合、OS は大概 Linux だろうと思われるので、crypt がサポートする暗号方式もおそらく 64 bits DES 方式かと思われる。その場合、ハッシュ化できる文字列は最大 8 文字までなので、crypt 関数自体を複数回に分けで呼び出してあげる必要があると思う。あーマンドクセ('A`)

乱数

セッション ID を生成する基本的なやり方は、状況を識別できる情報 (ユーザー ID、時刻、その他必要に応じてシチュエーションを識別する記号) と、暗号理論上安全な乱数とを混ぜ合わせた文字列*1を、ハッシュ関数によって符号化*2する、というもの。十分に識別可能であり、また、十分に予測不可能であることが必要とされるわけです。

で、その肝心の乱数ですが、仮にサーバーの OS が Linux ならば、/dev/random/dev/urandom を使用することができます。例えば Perl で 64 bits (= 8 Bytes) の乱数列を得るには、以下のように記述することになります。

my $text;
open randin, "</dev/random"  or die 'Cannot use /dev/random';
read randin, $text, 8;
close randin;

Manpage


続きを読む

[設計・開発]
[個人的メモ]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット