2011-07-30 39 views
1

下面的代碼片段是在PHP中,但我看到其他網絡編程語言的開發人員散列隨機數字。爲什麼散列(不使用鹽)隨機數?

if ($loginValid=='yes') { 
    $token = sha256(generateRandomNumber()); 
    $_SESSION["token"] = $token; 
    $_SESSION["userid"] = $id; 
    setcookie("authenticationtoken", $token, ...) 
} 

sha256是一個密碼散列函數。由於它不使用鹽,因此無論您輸入什麼樣的輸入,都會輸出相同的輸出。試試看:

http://www.xorbin.com/tools/sha256-hash-calculator

在什麼情況下被散列(不使用鹽)好的做法隨機數?

回答

4

我的猜測是它只是一個簡單的獲取已知大小散列的方法,與generateRandomNumber()返回的大小無關。顯然,如果generateRandomNumber()的範圍很小,那麼也會反映在返回的不同哈希數中。

+3

OMG!當Jon Skeet回答我的問題時,我從未想過這一天會到來!應該有一個「Jon Skeet」徽章。這是鉑金,如果Jon Skeet回答你的問題,你就會獲得獎勵。 – user784637

+2

我現在在想「我不配」...... http://www.youtube.com/watch?v=-FucbvoFFy0 – Spence

1

假設GenerateRandomNumber沒有隨機種子,即它是一個真正的密碼安全的隨機數,鹽將不是必需的。請記住,salt的目的是確保如果將相同的輸入用於散列函數,它將返回兩個不同的結果。

如果令牌只需要傳遞給客戶端的祕密,那麼醃製這個散列並不會真的有幫助。

僅供參考,您可以在密碼散列中使用salt。您不需要存儲用戶密碼,而是存儲它的散列值,這樣如果數據庫被侵入,則沒有人可以竊取用戶的密碼。但是,您不希望使用相同密碼的人獲得相同的散列值,因此您需要在密碼被哈希化之前添加一個鹽以確保即使兩個用戶具有相同的密碼,他們也應該得到不同的散列值。 OMG!