如何正确解释散列方案的递归伪代码

时间:2015-09-25 14:04:25

标签: php hash syntax cryptography

我尝试按照this paper(默多克的强化无状态会话Cookie)来实现一种腌制机制。以下伪代码描述了代码:

a[0](salt, password ) = H(salt||password )  
a[x](salt, password ) = H(a[x−1](salt, password )||password )  
     

H:密码安全散列函数
  x:哈希迭代次数
  a:认证者
  salt:Per-account,加密安全伪随机数约128bit
  密码:用户pw用明文

我想知道php实现是否应该如下:

$a0 = hash('sha256', $salt | $password);
$auth = recursiveHash($a0, $password, 256)

function recursiveHash($salt, $password, $counter) {
    if ($counter === 0) {
        return hash('sha256', $salt | $password);
    } else {
        $counter--;
        return $this->recursiveHash(hash('sha256', $salt | $password), $password, $counter);
    }
}

总的来说:我确实很难用完全的句法解释。 $ varOne,$ varTwo是什么意思?它是最后一次函数调用的结果吗?是||按位OR运算符?为什么不单一?以下是什么意思:

c = a[n](salt, password )

它是否相同(当n == x时):

a[x](salt, password ) = H(a[x−1](salt, password )||password )

如果有人可以帮助我完成本文的语义和句法解释,那将非常高兴。

1 个答案:

答案 0 :(得分:2)

所以你有:

a[0](salt, password) = H(salt || password )  
a[x](salt, password) = H(a[x−1](salt, password) || password)

首先请注意,||表示在这种情况下连接。比特操作数在这里没有意义,因为你不想删除密码的位。

然后,让我们来了解如果n具有值2

会发生什么
a[0](salt, password) = H(salt || password )
a[1](salt, password) = H(a[1−1](salt, password) || password) = H(a[0](salt, password) || password) = H(H(salt || password) || password)
a[2](salt, password) = H(a[1](salt, password) || password) = H(H(H(salt || password) || password) || password)

因此,您可以看到您可以简单地重用以前的哈希值,将密码字节添加到它们,然后再次哈希。

通常,您不应该使用递归方法。您不需要回溯,迭代次数n通常很高。这意味着递归函数需要很高的内存,而不必保留中间值。

最后,在您的代码中,您使用salt变量作为中间哈希值的输入。这不正确,只有一个salt,而这是您开始使用的那个。enemyNo = Random.Range (0, enemies.Length) 。此外,您应确保在密码上应用特定的