2012-06-30 49 views
1

我想在我的系統中使用Bcrypt進行密碼加密。但是,所有的例子是這樣的:Bcrypt之前使用512哈希?

$password = $_POST['password']; 
$salt = substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22); 
$hash = crypt($password, '$2a$12$'.$salt); 

這看起來相當安全的,我的,但我想知道,在每個例子中,沒有人使用散列之前Bcrypt密碼。

由於獨特的鹽,彩虹表不應該能夠一次破解所有的密碼。但是如果黑客拿到一條記錄並用該特定記錄的鹽創建彩虹表,他應該能夠破解弱密碼。

因此,如果有人需要一個弱口令(讓我們說「富」),這將是更安全的使用SHA-512使用Bcrypt之前的第一個散列它。我對嗎?或者這看起來更安全?

+1

只爲一個散列創建一個彩虹表是毫無意義的。 – Gumbo

回答

2

其實答案必須是沒有,它不會使密碼意義上的哈希顯着增強。正如您可能知道的那樣,bcrypt(儘管使用的函數名爲crypt)本身就是散列函數,而不是加密函數。

在bcrypt中,你傳遞一個成本因子,它定義了將要完成多少次迭代(通常是數百次)。 減慢哈希的計算,是什麼使蠻力攻擊不切實際。之前使用SHA-512,只會增加一次迭代。

你說什麼是正確的,但當然如果你必須爲每個密碼建一個彩虹表,你只需要蠻力,直到你找到一個匹配,不需要建立整個彩虹表。

如果攻擊者可以控制數據庫和代碼,那麼額外的SHA-512將毫無幫助(只有更多的單次迭代)。如果他只有數據庫沒有代碼(SQL注入),那麼他將識別bcrypt散列。他現在可以用bcrypt蠻力,但由於SHA-512沒有任何弱密碼。這就像SHA-512散列是破解的密碼,所以字典是沒有用的。這是默默無聞的安全性,但只要代碼未知,它就會有效。在使用bcrypt和獨特的鹽之前,可以通過添加修正的硬編碼鹽(關鍵字)來獲得相同的效果。

+1

是的,當攻擊者擁有數據庫和代碼時,它沒有任何意義。但是如果攻擊者只擁有數據庫,那麼處理密碼(使用散列或salt或其他)會使系統更安全,因爲再也沒有任何弱密碼了。 感謝您的幫助!我想我會用硬編碼的鹽來保護用戶的弱密碼;) – VIDNA

1

crypt()是一個單向字符串散列,而不是加密機制。要使用SHA-512散列,您必須使用hash()函數。 Bcrypt需要PHP擴展。爲了存儲密碼,你爲什麼要讓它們可逆,而不是僅僅對它們進行散列?這是不太安全的 - 如果有人得到你的密鑰和數據庫,他們有所有的密碼,但一張SHA512哈希表是相當無用的。

+0

以'$ 2a'爲參數調用'crypt()',實際上會計算一個bcrypt哈希值。 Bcrypt本身就是一個散列函數,Vidna不想加密密碼。 – martinstoeckli

0

bcrypt已經使用鹽,它在內部做的比SHA512強很多。在bcrypt之上添加一個SHA512迭代(和/或一個額外的鹽層)不會給你一個明顯更強的結果。如果兩個函數以錯誤的方式相互作用,那麼以這種方式組合它們實際上可能會給你一個較弱的散列函數。

1

哈希首先不會幫助。錯誤的密碼是攻擊者認爲更可能的密碼,並將其放置在他的密碼列表中以便嘗試。

Bcrypt包含鹽,以消除預先計算的查找表(彩虹表是一個例子)。爲什麼攻擊者會爲單個記錄創建一個彩虹表?不,在攻擊密碼時,攻擊者只需簡單地通過他最有可能密碼的有序列表,重複哈希算法來查看它是否匹配。

他可以通過該列表工作多長時間取決於哈希算法執行多長時間。 Bcrypt用你的例子中的「成本」因子— 12控制它(這是可以的,但可能是我使用的最小值)。額外的SHA-512輪不會添加任何內容。您已經在執行4096個昂貴的bcrypt迭代。添加1個便宜的SHA-512迭代是微不足道的。

如果您選擇列表中的第一個密碼,它將在幾分之一秒內被破壞。如果您選擇第十億個密碼,攻擊者幾十年內不會破壞密碼。