【问题标题】:PHP How can I calculate length of Session ID before starting sessionPHP如何在开始会话之前计算会话ID的长度
【发布时间】:2013-06-04 20:04:46
【问题描述】:

如何在开始会话之前根据 php.ini 值 session.hash_functionsession.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_functionsession.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();

【问题讨论】:

    标签: php session sessionid


    【解决方案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_functionsession.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_functionsession.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

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      相关资源
      最近更新 更多