hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

セッションID発行のハッシュアルゴリズムの設定

今更ながら、PHPのセッションIDのハッシュアルゴリズムの変更と、セッションIDに使用する文字種を設定する項目があることを知りました。(PHP5以降のみ)

session.hash_functionとsession.hash_bits_per_character

今回設定する項目は、

  • session.hash_function => セッションIDのハッシュアルゴリズムの設定
  • session.hash_bits_per_character => セッションIDに使用する文字種を設定

になります。

詳し説明はこちら↓。

session.hash_function
session.hash_function によりセッション ID を生成するために使用されるハッシュアルゴリズムを指定することが可能です。 '0' は MD5 (128 ビット) で、'1' は SHA-1 (160 ビット) を意味します。

session.hash_bits_per_character
session.hash_bits_per_character により バイナリのハッシュデータを何らかの可読なデータに変換する際、 それぞれの文字に何ビットストアさせるかを定義することが可能です。 指定可能な値は、'4' (0-9, a-f)、'5' (0-9, a-v) そして '6' (0-9, a-z, A-Z, "-", ",") です。

http://www.php.net/manual/ja/session.configuration.php#ini.session.hash-function

実際に設定してみる

「session.hash_function」「session.hash_bits_per_character」共に、基本的には指定されているコード値での設定になります。
php.iniを見てみると指定できるコード値が記述してあります。
※後述しますが、PHP5.3.0以降の場合「session.hash_function」については任意のアルゴリズムの指定も可能です。

php.ini(デフォルト)
; Select a hash function for use in generating session ids.
; Possible Values
;   0  (MD5 128 bits)
;   1  (SHA-1 160 bits)
; http://php.net/session.hash-function
session.hash_function = 0

; Define how many bits are stored in each character when converting
; the binary hash data to something readable.
; Possible values:
;   4  (4 bits: 0-9, a-f)
;   5  (5 bits: 0-9, a-v)
;   6  (6 bits: 0-9, a-z, A-Z, "-", ",")
; Default Value: 4
; Development Value: 5
; Production Value: 5
; http://php.net/session.hash-bits-per-character
session.hash_bits_per_character = 5

デフォルトだと「MD5+5bits:0-9, a-v」に設定されています。
れぶろぐさんのページにもあるように、安全性の観点から「session.hash_function」は「MD5」ではなく「SHA-1」に設定変更したほうが良いと思います。
「hash_bits_per_character」については、ファイル名の大文字小文字を区別しないようなファイルシステムもあるという事なので、セッションをファイルで管理している場合は「5」を設定。
セッションをDBで管理しているのであれば、「6」に設定しても問題ないと思います。

SHA-1 & 文字種[0-9,a-v]で設定する場合
; [SHA-1] & [5 bits: 0-9, a-v]
session.hash_function = 1
session.hash_bits_per_character = 5
SHA-1 & 文字種[0-9,a-z,A-Z,-,","]で設定する場合
; [SHA-1] & [6 bits: 0-9, a-z, A-Z, "-", ","]
session.hash_function = 1
session.hash_bits_per_character = 6

ちなみに、「session.hash_function」「session.hash_bits_per_character」は「ini_set」での設定も可能です。
共用サーバーを使用していてphp.iniを変更できない場合は、このやり方で設定を変更できます。

「ini_set」で設定
<?php
/* [SHA-1] & [5 bits: 0-9, a-v] */
ini_set('session.hash_function', 1);
ini_set('session.hash_bits_per_character', 5);
?>

セッションIDの長さについて

セッションIDの長さについては、「session.hash_function」と「session.hash_bits_per_character」に設定した値の組み合わせで変わります。
詳しくは、以下の表を参照してください。

「session.hash_function」×「session.hash_bits_per_character」=セッションIDの長さ
hash_function hash_bits_per_character セッションIDの長さ
0(md5) 4(4bits:0-9,a-f) 32桁
0(md5) 5(5bits:0-9,a-v) 26桁
0(md5) 6(6bits:0-9,a-z,A-Z,-,",") 22桁
1(sha1) 4(4bits:0-9,a-f) 40桁
1(sha1) 5(5bits:0-9,a-v) 32桁
1(sha1) 6(6bits:0-9,a-z,A-Z,-,",") 27桁

「session.hash_function」への任意アルゴリズムの指定(PHP5.3.0以降)

先に記述したとおり、PHP5.3.0以降では「session.hash_function」に任意アルゴリズムの指定ができます。

SHA-512を設定(php.ini)
; sha512
session.hash_function = sha512

もちろん、「ini_set」での指定も可能です。

SHA-512を設定(ini_set)
<?php
/* SHA-512 */
ini_set('session.hash_function', sha512);
?>

指定可能なアルゴリズムは「hash_algos()」で確認することができます。

hash_algos()で指定可能なアルゴリズムを確認
$ php -r 'print_r(hash_algos());'
Array
(
    [0] => md2
    [1] => md4
    [2] => md5
    [3] => sha1
    [4] => sha224
    [5] => sha256
    [6] => sha384
    [7] => sha512
    [8] => ripemd128
    [9] => ripemd160
    [10] => ripemd256
    [11] => ripemd320
    [12] => whirlpool
    [13] => tiger128,3
    [14] => tiger160,3
    [15] => tiger192,3
    [16] => tiger128,4
    [17] => tiger160,4
    [18] => tiger192,4
    [19] => snefru
    [20] => snefru256
    [21] => gost
    [22] => adler32
    [23] => crc32
    [24] => crc32b
    [25] => salsa10
    [26] => salsa20
    [27] => haval128,3
    [28] => haval160,3
    [29] => haval192,3
    [30] => haval224,3
    [31] => haval256,3
    [32] => haval128,4
    [33] => haval160,4
    [34] => haval192,4
    [35] => haval224,4
    [36] => haval256,4
    [37] => haval128,5
    [38] => haval160,5
    [39] => haval192,5
    [40] => haval224,5
    [41] => haval256,5
)

今回参考にしたページ

php.ini の session.hash_bits_per_character の設定を変更してみる - れぶろぐ
http://www.revulo.com/blog/20080220.html

PHPのSession IDの長さを変更する - まつぼっくりんご
http://matsu.tymy.net/blog/2008/10/28/php%E3%81%AEsession-id%E3%81%AE%E9%95%B7%E3%81%95%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B/

hash_algos - PHP Manual
http://www.php.net/manual/ja/function.hash-algos.php