2011-09-08 196 views
2

根據PHP的doc,bcrypt鹽製成的存儲bcrypt哈希

「$ 2A $」,一個兩位數的成本參數, 「$」,並從字母」 22位./0-9A -Za-Z」

所以,如果我使用的隱窩()函數來散列我的密碼,所得到的輸出包括前7個字符($ 2A $ 10 $,如果10是成本參數),爲部分的鹽 - 根據我在互聯網上找到的所有例子,這個完整的輸出寫入db。

我想知道在鹽和加密數據的其餘部分存儲這些第一個字符有什麼意義。他們的含義對我來說是完全清楚的,但我不明白爲什麼這些信息應該與其餘的散列一起寫。他們不是「只是」關於算法和計算的適應性成本的信息嗎?那麼存儲這種與應用程序相關的信息有什麼好處?而且(即使聽起來可能幼稚)爲什麼要將它們泄露給最終能夠抓取我的數據庫的攻擊者?

回答

11

原因是因爲crypt如何工作。它的設計,讓您可以通過將一切做到以下

if ($hashedPassword == crypt($rawPassword, $hashedPassword)) { 
    //Verified 
} 

所以,你不需要每次都重新創建salt字符串...

和鹽的點是不被祕密。事實上,這並不意味着保密。這意味着箔彩虹表。記住,如果他們能抓住你的數據庫,那麼他們可以獲得其他東西的機會很高,所以把鹽放在其他地方並不會給你太多。

此外,鹽沒有多大幫助。 BCrypt被設計爲CPU-Hard,這意味着暴力(即使知道鹽)是不切實際的。這就是爲什麼你有成本參數。所以不要擔心「隱藏」鹽。只需將它與密碼一起存儲,你就會很好...

更不用說,如果將來你想調整算法會發生什麼?例如,假設您想增加成本參數,因爲安裝了更好的硬件。如果您未將此信息與密碼一起存儲,則您存儲的所有密碼都將失效。這樣,每個存儲的密碼都具有驗證它所需的全部信息。這樣,如果哈希是當前的默認值,並且如果不重新哈希並使用新哈希來更新數據庫,則可以檢查有效的登錄。它可以防止與更新和改進哈希方法相關的問題...

+0

謝謝,ircmaxell!事實上,爲什麼鹽必須與密碼一起存儲,這一點我已經很清楚了。我只是想知道爲什麼我還必須存儲有關算法的信息(crypt()輸出的前7個字符)和成本。你的答案的第二部分刪除我所有的疑惑。 – geezmo