このトピックについてオンラインで書かれたかなり素晴らしいチュートリアルがあることがわかりました。グーグルのどこで見つけたのかよく覚えていませんが、目の前にあるので、関数を自分で十分に分解できるかどうか見てみましょう...
最初の関数は、任意のサイズのキーの長さを作成できます。私はそれをかなり重くコメントする自由を取りました...
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 回反復するループを開始します (それ自体のハッシュを作成します)
- 各反復を XOR し、それを $iterated_block に追加します (以前のハッシュを現在のハッシュに xor します)
- XOR ループの終了
- 各ブロックの $key に $iterated_block を追加
- ブロックループ終了
- 鍵を返す
これがおそらくこれを行うための最良の方法だと思います。多分私はあまりにも妄想的ですか?