如何将hash()的哈希转换为init / update / final?

时间:2014-02-04 19:05:39

标签: php hash iteration salt sha512

假设我有一个线性哈希算法:

<?php
    $input = "password1";

    $round1 = hash('sha512', $input, true);
    $round2 = hash('sha512', $round1, true);

    echo(base64_encode($round2) . "<br>\n");
?>

如何使用hash_inithash_updatehash_final将其转换为for循环?我现在有一个在for循环中使用这些算法的算法,但是我无法发布它。

1 个答案:

答案 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循环