2015-09-25 76 views
3

我试图遵循this paper(默多克硬化无状态会话Cookie)来实现salting机制。以下伪代码描述的代码:如何正确解释哈希方案的递归伪代码

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

H:加密安全散列函数
X:哈希迭代计数
一个:验证器
盐:每账号,密码安全伪随机数约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) 

会很高兴,如果有人可以帮助我的语义和句法解释这张纸。

+0

所以基本上你正在尝试创建一个盐渍散列。为了做到这一点,您只需将表单中获得的密码与安全随机生成的盐串联起来即可。背后的主要思想是为相同的密码设置不同的哈希值。如果您是初学者,请注意这一点,因为这很容易导致错误:https://www.youtube.com/watch?v=8ZtInClXe1Q –

+0

我想我知道一般密码存储问题。我的问题是,如果在这种特殊情况下的腌制是通过按位或操作或经典追加添加的。更一般的是,如何正确读取纸张的伪代码。 – user3657114

+0

我的问题中没有看到任何'$ varOne,$ varTwo'?那些定义在哪里? 'a [n]'源自哪里? –

回答

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) 

所以你可以再次见到你可以简单地重新使用以前的散列值,密码字节加给他们,和哈希值。

通常你不应该为此使用递归方法。你不需要回溯,迭代次数通常很高。这意味着对递归函数的内存要求很高,而中间值不必保留。

最后,在您的代码中,您使用salt变量作为中间散列值的输入。这是不正确的,只有一个salt,这就是你开始。此外,您应确保您在密码上应用了特定的