如何正确解释哈希方案的递归伪代码
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
,这就是你开始的那个。此外,您应该确保在密码上应用特定的 character-encoding。
我尝试按照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
,这就是你开始的那个。此外,您应该确保在密码上应用特定的 character-encoding。