2011-08-16 81 views
14

怎麼比,比如說強bcryptbcrypt和散列多次之間有什麼區別?

def md5lots(password, salt, rounds): 
    if (rounds < 1) 
     return password 
    else 
     newpass = md5(password + salt) 
     return md5lots(newpass, salt, rounds-1) 

給我的感覺,因爲它的炒作,更聰明的人比我想通了bcrypt是比這更好的。有人能解釋「聰明門外漢」中的區別嗎?

+1

bcrypt的循環次數是'2^i',所以它是指數增長,但是,在相關筆記上非常好的問題是,將bcrypt與HMAC hash進行比較將會很有趣硬化」。 – 2011-08-16 01:07:10

回答

3

有bcrypt和之間的三個顯著差異散列多次用MD5:

  1. 輸出的大小:128位(16字節),用於MD5和448位(56字節)用於bcrypt。如果您將數百萬散列存儲在數據庫中,則必須將其考慮在內。
  2. 碰撞和原像攻擊對MD5是可能的。
  3. 隨着cpu的功能越來越強大,Bcrypt可以配置越來越多。

因此,使用MD5進行醃製和拉伸並不像使用bcrypt那麼安全。這個問題可以通過選擇比MD5更好的散列函數來解決。

例如,如果選擇SHA-256,則輸出大小將爲256位(32字節)。如果salting-and-stretch可以配置爲增加像bcrypt這樣的迭代次數,那麼除了存儲結果散列所需的空間量之外,兩種方法之間沒有區別。

+0

如果您使用bcrypt具有預先哈希的密碼(工作因子12),並且您將工作因子增加到14,那麼您是否必須重設密碼?或者可以在給定工作因子的情況下重新散列哈希密碼 –

+0

好的,忘記MD5,這不是我的問題的要點。假設我的示例程序中有一個隨機散列,與bcrypt的輸出一樣長。點1被消除。點3也被淘汰,因爲我上面的例子解決了這個問題(重複哈希來縮短CPU時間)。第2點仍然是:假設一個更好的哈希,是什麼讓bcrypt更好? –

+0

@luke沒有,如果你可以配置你的醃製和拉伸的迭代次數 – JVerstry

1

您正在有效地談論實施PBKDF2或基於密碼的密鑰推導函數。實際上它與BCrypt是一樣的,其優點是可以延長獲取密碼所需的CPU時間。與BCrypt相比,這樣做的好處是,通過知道有多少'迭代'可以讓您通過密碼,當您需要增加密碼時,您可以執行而不需要重置數據庫中的所有密碼。只要你的算法拿起最終結果,就好像它在第n次迭代(其中n是先前的迭代計數)並繼續進行!

建議您使用一個合適的PBKDF2庫,而不是創建自己的庫,因爲讓我們面對它,就像所有加密技術一樣,唯一的方法就是知道某些東西是否安全,如果它已經被interwebs'測試'。 (見here

系統使用此方法:
.NET已經實現了一個圖書館。請參閱here
Mac,Linux和Windows文件加密使用此加密方法的許多密碼(10,000+)版本來保護其文件系統。
Wi-Fi網絡所使用的加密這種方法對提出的問題
Source

由於經常保護,它迫使我的研究,我是使用針對保護我的密碼的方法。

TTD

4

主要區別 - 用於驗證數據的MD5和其他哈希函數被設計得很快,而bcrypt()被設計得很慢。

當您驗證數據時,您需要速度,因爲您希望儘可能快地驗證數據。

當您嘗試保護證書時,速度對您不利。具有密碼哈希副本的攻擊者將能夠執行更多的蠻力攻擊,因爲MD5和SHA1等執行起來很便宜。相比之下,bcrypt是故意昂貴的。當有一兩次嘗試由真正的用戶進行認證時,這一點很重要,但是對於暴力破解來說成本更高。

0

嚴格地說,bcrypt實際上加密文本:

OrpheanBeholderScryDoubt

64倍。

但它使用從密碼和一些隨機生成的鹽中派生出來的密鑰。

1

雖然這個問題已經得到解答,但我想指出BCrypt和哈希循環之間的細微差別。我會忽略已棄用的MD5算法和指數成本因素,因爲您可以在您的問題中輕鬆改進這一點。

您正在計算散列值,然後使用結果計算下一個散列值。如果您查看BCrypt的實現,您可以看到,每次迭代使用生成的哈希值以及原始密碼(密鑰)。

Eksblowfish(cost, salt, key) 
    state = InitState() 
    state = ExpandKey(state, salt, key) 
    repeat (2^cost) 
    state = ExpandKey(state, 0, key) 
    state = ExpandKey(state, 0, salt) 
    return state 

這是什麼原因,你不能把一個Bcrypt散列密碼,並繼續進行迭代,因爲你必須知道原來的密碼即可。我無法證明它,但我想這使得Bcrypt比簡單的哈希循環更安全。

相關問題