假设我有一个线性哈希算法:
<?php
$input = "password1";
$round1 = hash('sha512', $input, true);
$round2 = hash('sha512', $round1, true);
echo(base64_encode($round2) . "<br>\n");
?>
如何使用hash_init
,hash_update
和hash_final
将其转换为for循环?我现在有一个在for循环中使用这些算法的算法,但是我无法发布它。
答案 0 :(得分:3)
抓谈我关于关闭句柄的说法,这就是hash_copy()
函数的用途。你可能正在寻找类似的东西:
$algo = 'sha512';
$input = 'password';
$rounds = 1000;
function extend($algo, $rounds, $input) {
$ctx = hash_init($algo);
hash_update($ctx, $input);
for($i=1; $i<$rounds; $i++) {
hash_update($ctx, hash_final(hash_copy($ctx), TRUE));
}
return hash_final($ctx, TRUE);
}
echo base64_encode(extend($algo, $rounds, $input));
但这基本上将哈希值附加到,而现有的代码会重新散列哈希值。您将无法获得与使用此方法发布的代码相同的结果。
如果你想复制你拥有的代码,那么就像:
$algo = 'sha512';
$input = 'password';
$rounds = 1000;
function cycle($algo, $rounds, $input) {
$curhash = reinvent_the_wheel($algo, $input);
for($i=1; $i<$rounds; $i++) {
$curhash = reinvent_the_wheel($algo, $curhash);
}
return $curhash;
}
//equivalent to hash($algo, $input, $true);
function reinvent_the_wheel($algo, $input) {
$ctx = hash_init($algo);
hash_update($ctx, $input);
return hash_final($ctx, TRUE);
}
echo base64_encode(cycle($algo, $rounds, $input)) . "\n";
基本上与您发布的代码相同,只是添加了 for
循环。