重複しないユニークなIDを生成する (Perl, ID, SHA1・MD5)
ユーザーを識別するため、ファイルをサーバに保存するなど何らかの理由により重複しないIDを生成したい場合にはどうすれば良いだろうか?
通常のCGIであれば、CGI::Sessionなどを用いる方法もあるが、次のようなコードを書くことでも実現できる。
以下のコードを動かすには、Digest::SHA1モジュールがインストールされていることが必要である。
;#
;#セッションID
;#
use Digest::SHA1 qw(sha1_hex);
print genUniqID();
#----------------------------------------------#
#■ユニークなIDを生成する
#----------------------------------------------#
sub genUniqID{
my $seed = shift || 'seed-string';
my $id = join(''
, $ENV{'REMOTE_ADDR'}
, $ENV{'HTTP_USER_AGENT'}
, time
, $$
, rand(9999)
, $seed
);
return(sha1_hex($id));
}
○実行結果
ユーザーのIPアドレス、ブラウザ名(ユーザーエージェント)に加え時間、プロセスID、乱数、なにがしかの自由な文字列から構成されている。これらの文字列をそのまま連結してしまうと、セキュリティ的によろしくないため、不可逆な文字列に変換する。
ここではSHA1と呼ばれる方法を用いているが、場合によってはMD5などおなじみの方法でもかまわない。ただMD5はとある脆弱性を抱えており、それをSHA1が解決していると言われているため、なるべくSHA1を使っておいた方が良いだろう。
CGI::Sessionが使いたいという場合は、こちらのページを参照されたい。
CGI::Session - CGIアプリケーションにおける持続的なデータのセッション
http://perldoc.jp/docs/modules/CGI-Session-3.11/Session.pod
○関連ページ
RFC 1321 (MD5)
http://www.faqs.org/rfcs/rfc1321.html
RFC 3174 (SHA1)
http://www.faqs.org/rfcs/rfc3174.html
○MD5の脆弱性について
「MD5」安全性の項より
http://ja.wikipedia.org/wiki/MD5#.E5.AE.89.E5.85.A8.E6.80.A7
MD5、およびRIPEMDとよばれるハッシュ関数には理論的な弱点が存在することが明らかとなっている2004年8月、暗号の国際会議 CRYPTO (のランプセッション)にて、MD5のコリジョンを求めることができたという報告があった。理論的可能性として、MD5を用いて改竄されないことを確認する場合、あらかじめ正規のファイルと不正なファイルを用意しておき、正規のファイルを登録しておきながら、実際には不正なファイルに摩り替える攻撃がありえることを意味する。但し、実際にこの弱点を利用したクラッキングはまだ報告されていない。
