我尝试按照这篇论文(默多克的硬化无状态会话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
,这是你开始的那个。此外,应该确保对密码应用特定的字符编码。