我尝试按照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 )
如果有人可以帮助我完成本文的语义和句法解释,那将非常高兴。
答案 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)
。此外,您应确保在密码上应用特定的character-encoding。