我只是在谷歌上搜索了很多关于 PHPSESSID 的信息,但我不知道他们目前使用的是哪个 Hashalgorythm。 我在我的 Rootserver 上安装了 PHP 5.5 并检查了我的 session ID,我意识到当前 ID 看起来像这样 3teao7a72gcg98pgelupl1p9l3。 如果您查看旧版本的 php,他们使用 MD5 算法来散列用于 session 的数据,如果我是对的,它类似于 IP:TIMESTAMP:PHPRAND:SYSTEMRAND/strong> 散列为 MD5 构建您的 sessionid。 我检查了我的 php.ini 并查看了 Hashfunction for Session 的属性
; 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
现在我发现 Algorythm 真的代表了 PHPSESSID,我用一些哈希标识符检查它但没有得到结果,你知道一些网站我可以看看生成 PHPSESSID 的函数吗?
感谢您的帮助:)
最佳答案
如果session.hash_function
为0,则为MD5。
您只是习惯于看到它是十六进制编码的,而 PHP 的 session 扩展可能会根据 session.hash_bits_per_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_bits_per_character = 4
(默认值)时,这与十六进制编码相同,因此只会使用 0-9a-f
字符。但是当该值更高时,为了能够在单个字符中打包更多的数据,就需要更多的字符。
这些是可能性:
4
:0-9a-f
个字符(十六进制编码)5
:0-9a-v
个字符6
:0-9a-zA-Z,-
个字符
根据您显示的示例 ID 的长度,我认为您有 session.hash_bits_per_character = 5
。
所有这些不适用于 PHP 7.1+,其中:
session.hash_bits_per_character
替换为session.sid_bits_per_character
session.hash_function
已删除,您直接提供session.sid_length
关于用于 PHPSESSID 的 PHP 5 Hashalgorythm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40805079/