2013-06-08 4 views
2

Как рассчитать длину идентификатора сеанса PHP на основе значений php.ini session.hash_function и session.hash_bits_per_character и перед началом сеанса.PHP Как рассчитать длину идентификатора сеанса перед началом сеанса

Я хочу создать и назначить пользовательский идентификатор сеанса, например session_id($customSessionId);, перед началом сеанса.

В моем местном значении машинного session.hash_function равно 0 (возможные значения «0» для MD5 и «1» для SHA-1) и значение session.hash_bits_per_character 5 (возможных значений «4» [0-9, аф ], '5' [0-9, av] и '6' [0-9, az, AZ, "-", ","]), а итоговая длина идентификатора сеанса равна 26.

Какова будет длина идентификатора сеанса, когда session.hash_function и session.hash_bits_per_character имеют другой набор значений, который может быть рассчитан до начала сеанса?

Я хочу рассчитать идентификаторы сеанса различной длины на разных серверах (локальном, промежуточном или производственном) и проанализировать настройки сеанса по умолчанию.

Запуск сеанса и вычисление идентификатора сеанса намного проще. Но я хочу, чтобы закодировать код что-то вроде:

// $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(); 

ответ

3

Вот все алгоритмы хеш-сессии для 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>'; 
    } 
} 
+0

Спасибо за ваш код sniplet описания длины идентификатора сессии для всех доступных {хеш-функция, бит на символ} комбинация. Но я хочу получить длину идентификатора сеанса до начала сессии, с известными значениями 'session.hash_function' и' session.hash_bits_per_character'. – rajukoyilandy

0

Я знаю, что я год и наполовину поздно. Однако вот ответ.

Каждый из алгоритмов хэширования возвращает строку с фиксированной длиной. Это легко узнать, что длина просто вычисления хэш:

$t = hash('md5', '', True); 
print strlen($t)*8; // 8 Bits per char 

ини вариант session.hash_bits_per_character указать, каким образом хэшируются строка (которая является бинарной строкой) должны быть преобразованы, чтобы сделать его печати и безопасным для хранения. Он указывает, сколько бит исходного хэша будет преобразовано в один символ на выходе. Для получения шестнадцатеричного вывода используется значение 4, так как каждая шестнадцатеричная цифра представляет 4 бита. Значение 6 - это кодировка Base 64. Вы можете использовать информацию о session.hash_function и session.hash_bits_per_character рассчитать размер полученного идентификатора сессии вычисления хэша, а затем рассчитать конечную длину она будет иметь:

$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"; 
 
Algorithm: md5 
Hash Length (chars): 16 
Bits Per Char: 5 
Final Length (chars): 26 
Смежные вопросы