我发现网上有一篇关于这个主题的相当不错的教程。我不太记得我在谷歌上找到它的地方,但让我看看我是否可以自己分解这个功能,因为它就在我面前......
首先是函数,它可以创建任意大小的密钥长度。我冒昧地对它进行了相当大的评论......
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 循环
- 获取块的初始哈希,并将二进制的块计数器附加到 salt
- 开始循环以迭代块 $iter_count 次(创建自身的哈希)
- XOR 每次迭代并将其附加到 $iterated_block (xor 以前的哈希到当前)
- XOR 循环结束
- 为每个块附加 $iterated_block 到 $key
- 块循环完成
- 归还钥匙
我觉得这可能是最好的方法。也许我太偏执了?