PHPSESSID的PHP5哈希算法

PHPSESSID的PHP5哈希算法,php,Php,我只是在谷歌上搜索了很多关于PHPSESSID的信息,我不知道他们目前使用的是哪种hashalgorithm。 我在我的根服务器上安装了PHP5.5并检查了我的会话ID,我发现当前ID看起来像这样3teao7a72gcg98pgelupl9l3。 如果你看一下旧版本的php,他们使用MD5算法散列用于会话的数据,如果我是对的,它类似于IP:TIMESTAMP:PHPRAND:SYSTEMRAND散列到MD5构建会话ID。 我检查了我的php.ini,并查看了会话的Hashfunction的属性

我只是在谷歌上搜索了很多关于PHPSESSID的信息,我不知道他们目前使用的是哪种hashalgorithm。 我在我的根服务器上安装了PHP5.5并检查了我的会话ID,我发现当前ID看起来像这样3teao7a72gcg98pgelupl9l3。 如果你看一下旧版本的php,他们使用MD5算法散列用于会话的数据,如果我是对的,它类似于IP:TIMESTAMP:PHPRAND:SYSTEMRAND散列到MD5构建会话ID。 我检查了我的php.ini,并查看了会话的Hashfunction的属性

; Select a hash function for use in generating session ids.
; Possible Values
;   0  (MD5 128 bits)
;   1  (SHA-1 160 bits)
; This option may also be set to the name of any hash function supported by
; the hash extension. A list of available hashes is returned by the hash_algos()
; function.
; http://php.net/session.hash-function
session.hash_function = 0
现在我想用哪个算法来表示PHPSESSID,我用一些散列标识符来检查它,但是没有得到结果,你知道一些站点是什么吗?我可以看看生成PHPSESSID的函数吗


谢谢您的帮助:)

如果
session.hash\u函数
为0,则为MD5

您已经习惯于看到它是十六进制编码的,而PHP的会话扩展可能会根据
session.hash\u bits\u per\u character
设置对其进行不同的编码

这背后有很多难以理解的逻辑,但基本上这就是最终结果:

$hash_bits_per_character = ini_get('session.hash_bits_per_character');
$hash_function           = ini_get('session.hash_function');
switch ($hash_function) {
    case 0:
         $hash_function = 'md5';
         break;
    case 1:
         $hash_function = 'sha1';
         break;
    default:
         break;
}

$digest_size = mb_strlen(hash($hash_function, 'dummy', true), '8bit') * 4; // 128; 
$sid_length  = (int) ceil($digest_size / $hash_bits_per_character);
当您有
session.hash\u bits\u per\u character=4
(默认值)时,这与十六进制编码相同,因此仅使用
0-9a-f
字符。但当该值较高时,需要更多字符才能在单个字符中打包更多数据

这些是可能的:

  • 4
    0-9a-f
    字符(十六进制编码)
  • 5
    0-9a-v
    字符
  • 6
    0-9a-zA-Z,-
    字符
根据您显示的示例ID的长度判断,我认为您有
session.hash\u bits\u per\u character=5


所有这些都不适用于PHP 7.1+,其中:

  • session.hash\u bits\u per\u character
    已替换为
    session.sid\u bits\u per\u character
  • session.hash_函数
    被删除,您直接提供
    session.sid_长度

@MarkBaker您是否指向
bin\u to\u readable()
函数?顺便说一句,我喜欢rainbow elephpant:-)我更具体地指的是
php\u session\u create\u id()。。。很高兴你喜欢我,如果我错了,请纠正我。默认MD5会剪切messagediggest结果中的一些位,如果您使用更多的字符,这意味着丢弃的位和生成的哈希字符串的用户更少?好吧,我必须纠正您:MD5仍然是MD5。。。它不会切任何东西。每个字符的高位将有效地“压缩”数据,从而产生较短的字符串,但实际上不会丢失任何字符串。