2010-12-14 36 views
76

什麼是密碼散列的理想bcrypt工作因子。最佳bcrypt工作因子

如果我使用10的因子,我的筆記本電腦上的密碼大約需要1秒。如果我們結束了一個非常繁忙的網站,那麼只需檢查人員的密碼即可完成大量工作。

也許最好是使用7的工作因子,將每個筆記本電腦登錄的總密碼散列工作減少到大約.01s?

您如何決定暴力安全和運營成本之間的權衡?

+7

成本阻礙了離線攻擊。當「在線」時,您可以在兩次嘗試之間使用最小延遲(例如5秒)以防止拒絕服務攻擊。 – 2012-06-07 14:18:44

+3

關於InformationSecurity的重複:[爲bcrypt推薦的回合數](http://security.stackexchange.com/q/17207/46416) – 2014-08-25 20:00:13

+1

對於任何感興趣的人,我只寫了一個小型Java CLI工具來測試服務器上的bcrypt性能(這對於平衡安全性,服務器負載和響應時間顯然非常重要):https://github.com/cdraeger/hash-performance – Blacklight 2015-04-04 10:56:34

回答

96

請記住,該值存儲在密碼:$2a$(2 chars work)$(22 chars salt)(31 chars hash)。這不是一個固定的價值。

如果您發現負載過高,只需在下次登錄時進行設置,就可以將密碼更快地計算出來。同樣,隨着時間的推移和你得到更好的服務器,如果負載不是問題,你可以在登錄時升級它們的散列強度。

訣竅是使它保持大致相同的時間與摩爾定律一起永遠地走向未來。 該數字爲log2,因此每次計算機速度加倍時,將默認數字加1。

決定你想要用多長時間來強制用戶的密碼。例如,對於一些常見的字典詞,您的帳戶創建可能已經警告他們他們的密碼較弱。如果它是1000個常用單詞中的一個,比如說,它需要攻擊者0.1s來測試每個單詞,然後將它們購買100s(好吧,有些單詞更常見......)。如果用戶選擇了「常用字典單詞」+ 2個數字,那就是兩個多小時。如果您的密碼數據庫遭到入侵,並且攻擊者每天只能獲得幾百個密碼,那麼您已經購買了大部分用戶數小時或數天以安全更改其密碼。這是購買時間的問題。

http://www.postgresql.org/docs/8.3/static/pgcrypto.html有一些破解密碼供您考慮。當然,他們列出的密碼是隨機的。字典中的單詞...實際上,您無法保存密碼爲12345的傢伙。

+6

這真的是一個很好的答案。我甚至沒有考慮過重新登錄的想法。非常感謝! – Chris 2011-01-23 02:13:57

+1

recrypt如何工作?您必須將舊的bcrypt工作成本存儲在某個地方,以便您可以使用它來登錄它們,然後在驗證其密碼後,您將更新數據庫中的哈希和成本? – 2013-06-13 21:57:55

+4

@JerrySaravia bcrypt的美妙之處在於成本存儲在散列本身 - 所以你不需要存儲_anything_ extra。只需使用當前的散列進行身份驗證,然後立即重新生成具有不同代價的散列。簡單! – 2013-08-21 09:42:39