2015-09-25 78 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,這就是你開始。此外,您應確保您在密碼上應用了特定的