PHP如何在开始会话之前计算会话ID的长度
Posted
技术标签:
【中文标题】PHP如何在开始会话之前计算会话ID的长度【英文标题】:PHP How can I calculate length of Session ID before starting session 【发布时间】:2013-06-04 20:04:46 【问题描述】:如何在开始会话之前根据 php.ini 值 session.hash_function
和 session.hash_bits_per_character
计算 PHP 会话 ID 的长度。
我想在开始会话之前创建和分配自定义会话 ID,例如 session_id($customSessionId);
。
在我的本地机器中,session.hash_function
的值为 0(MD5 的可能值为 '0',SHA-1 的值为 '1'),session.hash_bits_per_character
的值为 5(可能的值为 '4' [0- 9, af], '5' [0-9, av], and '6' [0-9, az, AZ, "-", ","]),得到的 session id 长度为 26。
当session.hash_function
和session.hash_bits_per_character
有另一组值时,会话id的长度是多少,可以在开始会话之前计算?
我想通过分析默认会话设置来计算不同服务器(本地、暂存或生产)上不同长度的会话 ID。
启动会话和计算会话 ID 非常简单。但我想编写如下代码:
// $length = code to get length from hash_function and hash_bits_per_character
// this is my custom function to generate new session id having length $length
$myCustomSessionId = generateCustomSessionId($length);
// assign my custom session id
session_id($myCustomSessionId);
//and finally start the session :)
session_start();
【问题讨论】:
【参考方案1】:以下是 5.3 的所有会话哈希算法。如果您想在自己的服务器上试用,请使用底部的代码
algo bits length
md2 4 32
md2 5 26
md2 6 22
md4 4 32
md4 5 26
md4 6 22
md5 4 32
md5 5 26
md5 6 22
sha1 4 40
sha1 5 32
sha1 6 27
sha224 4 56
sha224 5 45
sha224 6 38
sha256 4 64
sha256 5 52
sha256 6 43
sha384 4 96
sha384 5 77
sha384 6 64
sha512 4 128
sha512 5 103
sha512 6 86
ripemd128 4 32
ripemd128 5 26
ripemd128 6 22
ripemd160 4 40
ripemd160 5 32
ripemd160 6 27
ripemd256 4 64
ripemd256 5 52
ripemd256 6 43
ripemd320 4 80
ripemd320 5 64
ripemd320 6 54
whirlpool 4 128
whirlpool 5 103
whirlpool 6 86
tiger128,3 4 32
tiger128,3 5 26
tiger128,3 6 22
tiger160,3 4 40
tiger160,3 5 32
tiger160,3 6 27
tiger192,3 4 48
tiger192,3 5 39
tiger192,3 6 32
tiger128,4 4 32
tiger128,4 5 26
tiger128,4 6 22
tiger160,4 4 40
tiger160,4 5 32
tiger160,4 6 27
tiger192,4 4 48
tiger192,4 5 39
tiger192,4 6 32
snefru 4 64
snefru 5 52
snefru 6 43
snefru256 4 64
snefru256 5 52
snefru256 6 43
gost 4 64
gost 5 52
gost 6 43
adler32 4 8
adler32 5 7
adler32 6 6
crc32 4 8
crc32 5 7
crc32 6 6
crc32b 4 8
crc32b 5 7
crc32b 6 6
salsa10 4 128
salsa10 5 103
salsa10 6 86
salsa20 4 128
salsa20 5 103
salsa20 6 86
haval128,3 4 32
haval128,3 5 26
haval128,3 6 22
haval160,3 4 40
haval160,3 5 32
haval160,3 6 27
haval192,3 4 48
haval192,3 5 39
haval192,3 6 32
haval224,3 4 56
haval224,3 5 45
haval224,3 6 38
haval256,3 4 64
haval256,3 5 52
haval256,3 6 43
haval128,4 4 32
haval128,4 5 26
haval128,4 6 22
haval160,4 4 40
haval160,4 5 32
haval160,4 6 27
haval192,4 4 48
haval192,4 5 39
haval192,4 6 32
haval224,4 4 56
haval224,4 5 45
haval224,4 6 38
haval256,4 4 64
haval256,4 5 52
haval256,4 6 43
haval128,5 4 32
haval128,5 5 26
haval128,5 6 22
haval160,5 4 40
haval160,5 5 32
haval160,5 6 27
haval192,5 4 48
haval192,5 5 39
haval192,5 6 32
haval224,5 4 56
haval224,5 5 45
haval224,5 6 38
haval256,5 4 64
haval256,5 5 52
haval256,5 6 43
这是我用来生成它们的代码:
session_start();
$algos = hash_algos();
foreach ($algos as $key => $algo)
ini_set('session.hash_function', $algo);
for ($i = 4; $i <= 6; $i++)
ini_set('session.hash_bits_per_character', $i);
session_regenerate_id();
echo $algo . ' - ' . $i . ' - ' . strlen(session_id()) . '<br>';
【讨论】:
感谢您的代码片段描述了所有可用 hash function, bits per char 组合的会话 ID 长度。但我想在开始会话之前获取会话 ID 的长度,已知值session.hash_function
和 session.hash_bits_per_character
。【参考方案2】:
我知道我迟到了一年半。然而,这里是答案。
每个散列算法都返回一个固定长度的字符串。很容易知道长度只是计算一个哈希:
$t = hash('md5', '', True);
print strlen($t)*8; // 8 Bits per char
ini 选项session.hash_bits_per_character
指示应如何转换散列字符串(它是二进制字符串)以使其可打印和安全存储。它指示原始哈希中有多少位将在输出时转换为单个字符。值 4 用于获得十六进制输出,因为每个十六进制数字代表 4 位。值 6 是 Base 64 编码。
您可以使用 session.hash_function
和 session.hash_bits_per_character
上的信息来计算生成的会话 id 的大小,然后计算它的最终长度:
$hash_function = ini_get("session.hash_function");
// Special case: 0=md5 and 1=sha1, anything else should be the
// name of the hashing algorithm
if($hash_function==0)
$hash_function="md5";
elseif($hash_function==1)
$hash_function="sha1";
;
$hash_bits = ini_get("session.hash_bits_per_character");
$t = hash($hash_function, "", True);
print "Algorithm: $hash_function\n";
print "Hash Length (chars): " . strlen($t) . "\n";
print "Bits Per Char: $hash_bits\n";
print "Final Length (chars): " . ceil(strlen($t)*8/$hash_bits) . "\n";
算法:md5
哈希长度(字符):16
每字符位数:5
最终长度(字符):26
【讨论】:
以上是关于PHP如何在开始会话之前计算会话ID的长度的主要内容,如果未能解决你的问题,请参考以下文章