Entry

プログラミングメモ - セッション管理用の SHA-1 生成クラスをパクってみた

2009年05月02日

少し前から,C++ 版の CGI フレームワークなんかを妄想しているんですけれど,セッションクラスでも作ろうかなー……とか思ってます。

今さら言うまでもないんですけれど,HTTP はセッションレスなプロトコルなので,セッションは自前で管理しなくちゃいけません。つまり,CGI でセッションを意識したアプリケーションを作るには,サーバ側でクライアントのセッションを覚えておかなくちゃいけない,ということです。サーバは,クライアントからアクセスされると,セッションを管理するためにユニークなキー(セッション ID)を付与します。具体的には,アクセス時刻とかクライアントの IP アドレスとか,サーバのプロセス ID とかスレッド ID とか,質のいい乱数とかその他もろもろとかを使って,あるアクセスが同一セッションにある(あるいは異なるセッションにある)かを識別することになる。

で,セッションの識別に使うキーなんですけれど,普通,IP アドレスとかアクセス時刻なんかをそのままセッション ID にすることはありません。どうしてかというと,人に読めるような形式の ID を使うと,他の人が簡単に他人のセッションを使えちゃうから。普通は作った ID をハッシュ関数で推測しづらい文字列にして管理します。

つことで,セッション管理にはハッシュ関数がつき物だったりします。

で,本題。セッション ID を生成するときに使うハッシュ関数にはいくつか種類があるんですけれど,大抵は MD5 や SHA-1 を使ってるんじゃないかと思います。どちらも衝突することが分かってて,バースデーアタックにひっかかる危険はあるんですけれど,実際よく使われています。もちろん,SHA-256 や SHA-512 のようにハッシュ長を十分に取れば,この危険は低くなります。けど,その分計算時間もかかるわけで,下手に凝ってオーバースペックになってしまうのも考えもの。

と,そんなこんなで,とりあえず,ここでは SHA-1 のハッシュ値を生成するクラスを作ってみました。つか,C で書かれたコードをいただいてきて,クラスにまとめただけなんですが。あまり仕事してない。

まとめたものはこちら。元が「自由に使用して可」だったので,こっちのも勝手に使ってください。

テスト用の main() メソッドも含めといたけれど,こんな風に使う。

#include <iostream>
#include "hash.h"

int
main(int argc, char* argv[]) {
    if (argc < 2) {
        std::cerr << "[ERR] argument error." << std::endl;
        std::cerr << "usage: " << argv[0] << " <string>" << std::endl;
        return -1;
    }
    Hash hash;
    std::string str = argv[1];
    std::cout << sha.getHash(str) << std::endl;
    return 0;
}

ただ,使ってみたんですけど,どうも巷のハッシュ値と結果が違う。ここら辺は,元ソースにもコメントがあって,こんなことが書いてありました。

 * Bugs:
 *      The standard is defined for bit strings; I assume bytes.

バグなのか?それはそれでいい気もするんだけれど。普通に OpenSSL あたりとリンクした方がよさげ……と,今思った。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN