Я обнаружил, что по этой теме в Интернете было написано довольно хорошее руководство.Я не совсем помню, где в Google я нашел это, но позвольте мне посмотреть, смогу ли я разобрать функцию достаточно хорошо, так как она прямо передо мной ...
Сначала функция, она может создатьдлина ключа любого размера.Я позволил себе довольно много комментариев:
function pbkdf2($password,$salt,$iter_count = 1500,$key_length = 32,$algorithm = 'sha512')
{
/*
@param string password -- password to be encrypted
@param string salt -- salt to encrypt with
@param int iter_count -- number of times to iterate blocks
@param key_length -- length of key to return
@param $algorithm -- algorithm to use in hashing
@return string key
*/
//determine the length of the hahs
$hash_length = strlen(hash($algorithm,NULL,TRUE));
//determine the number of key blocks to compute
$key_blocks = ceil($key_length/$hash_length);
//initialize key
$key = '';
//create the key itself
//create blocks
for($block_count = 1;$block_count <= $key_blocks;$block_count++)
{
//initalize hash for this block
$iterated_block = $block = hash_hmac($algorithm,$salt.pack('N',$block_count),$password,TRUE);
//iterate blocks
for($iterate = 1;$iterate <= $iter_count;$iterate++)
{
//xor each iterate
$iterated_block ^= ($block = hash_hmac($algorithm,$block,$password,TRUE));
}
//append iterated block
$key .= $iterated_block;
}
//return the key
return substr($key,0,$key_length);
}
- Первое, что он делает, это вычисляет длину хэша.
- Затем он определяет, сколько ключевых блоковтребуются для указанной длины ключа
- Затем инициализируется хэш (ключ) для возврата
- устанавливает цикл for, который будет создавать каждый блок
- принимает начальный хешблок со счетчиком блоков в двоичном коде, добавленный к соли
- начинает цикл для итерации блока $ iter_count times (создайте свой хеш)
- XOR каждая итерация и добавьте его в $ iterated_block(xor предыдущего хэша к текущему)
- Завершение цикла XOR
- добавление $ iterated_block к $ key для каждого блока
- завершение цикла блока
- возвращение ключа
Мне кажется, это, наверное, лучший способ сделать это.Может я слишком параноик?