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

How to correctly interpret recursive pseudo code for a hashing scheme

我尝试按照this paper(Murdoch的Hardened Stateless Session Cookies)来实现加盐机制。以下伪代码描述代码:

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

H: Cryptographically secure hash function
x: Hash iteration count
a: Authenticator
salt: Per-account, cryptographically secure pseudorandom number about 128bit
password: User pw in cleartext

我想知道 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,这就是你开始的那个。此外,您应该确保在密码上应用特定的