如何正确解释哈希方案的递归伪代码


How to correctly interpret recursive pseudo code for a hashing scheme

我尝试按照这篇论文(默多克的硬化无状态会话cookie)来实现一种盐化机制。下面的伪代码描述了该代码:

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

H:加密安全哈希函数
x:哈希迭代计数
答:身份验证
salt:每个帐户,加密安全伪随机数约为128位
密码:明文用户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是什么意思?它是最后一个函数调用的结果吗?是一个位或运算符?为什么不是一个呢?

是什么意思?
c = a[n](salt, password )

是否与

相同(当n == x时):
a[x](salt, password ) = H(a[x−1](salt, password )||password )

如果有人能帮我解释一下这篇论文的语义和语法,我将非常高兴。

所以你有:

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,这是你开始的那个。此外,应该确保对密码应用特定的字符编码。