読者です 読者をやめる 読者になる 読者になる

セッションIDの作り方

PHP Ruby Django

メモ。

PHP

  • REMOTE_ADDR, 現在の秒数, 現在のミリ秒, (0, 1)の範囲のランダムなdoubleを結合してランダムな文字列を作る
  • session.hash_functionで指定されたハッシュアルゴリズム(MD5 or SHA-1)でdigestをする
  • session.entropy_lengthが0以上が指定されている場合、session.entropy_file(たいていは/dev/urandomだろう)からnバイト読み込んで、digestをアップデート
  • session.hash_bits_per_characterで指定された方法で、digestを可読可能なデータに変換

外から取得した情報(REMOTE_ADDR)を使っていいのだろうかというのが疑問点。

Rails

OpenSSLモジュールが利用可能な場合、

OpenSSL::Random.random_bytes(n)

で得た結果をhexstringに変換。OpenSSLモジュールがない場合は、unixならば、/dev/urandomからnバイト読み込んで結果をhexstringに変換。

Django

  • 以下の値を結合してMD5でdigestし、hexstringを得る
    • 0から18446744073709551616Lまでのランダムな整数
    • OSのpid
    • unixタイムスタンプ
    • settings.SECRET_KEYに指定したランダムな文字列

getpid()が利用できない環境(例えばJython)ではこの値が1で固定なのがいいのだろうかというのが疑問点。あと、ハッシュアルゴリズムがMD5固定で、/dev/urandomを使うようなオプションもない。

【追記】
/dev/urandomに関しては間違っていた。

# Use the system (hardware-based) random number generator if it exists.
if hasattr(random, 'SystemRandom'):
    randrange = random.SystemRandom().randrange
else:
    randrange = random.randrange

のようになっているから、利用できる環境では必ず/dev/urandomが使われる。