題:
是否有安全專家建議使用bcrypt進行密碼存儲?
Sam Saffron
2010-09-16 05:05:57 UTC
view on stackexchange narkive permalink

在表面上的bcrypt上,由 Niels Provos和David Mazieres設計的用於散列密碼的11年安全算法,它基於NIST批准的河豚算法中使用的初始化函數,似乎太好了是真實的。它不易受彩虹表的攻擊(因為創建它們太昂貴了),甚至也不易受到暴力攻擊。

但是11年後,許多人仍然使用帶有鹽的SHA2x來存儲密碼哈希,而bcrypt是沒有被廣泛採用。

  • 關於bcrypt(通常是密碼哈希)的NIST建議是什麼?
  • 著名的安全專家(例如Arjen Lenstra等)對使用bcrypt進行密碼哈希處理有何看法?
關於這個主題,這是一個有趣的閱讀:http://www.tarsnap.com/scrypt/scrypt.pdf
另請參閱:http://stackoverflow.com/questions/1561174/sha512-vs-blowfish-and-bcrypt/1561245#1561245
是的,bcrypt有許多精明的支持者,儘管您當然想在性能上調整迭代次數,並在考慮DoS攻擊時調整其他防禦措施。另請參閱[如何安全地對密碼進行哈希加密? -IT安全](http://security.stackexchange.com/questions/211/how-to-securely-hash-passwords)和[密碼哈希添加鹽+胡椒粉還是足夠鹽?](http:// security。 stackexchange.com/questions/3272/password-hashing-add-salt-pepper-or-is-salt-足夠了)
-1
我的意思是任何安全專家都會推薦bcrypt。 `:P`
快速說明一下,我個人採用了bcrypt或pbkdf2(取決於平台)並對不同的設置進行基準測試。根據我使用它的目的,我使用會使它花費一定時間的設置。例如,對於台式機應用程序,我的目標時間約為80毫秒(我的筆記本電腦速度相對較快),對於服務器,我將其作為服務器的基準測試,並根據我期望的流量確定目標。
要回答標題中的問題:是。我是一名高級信息安全架構師,定期為我們的客戶編寫加密策略。bcrypt是我明確推薦的密碼哈希算法之一。
如今,在2019年,我將在哈希密碼時使用Argon2。
五 答案:
Thomas Pornin
2011-08-19 23:30:27 UTC
view on stackexchange narkive permalink

Bcrypt具有可以用密碼算法獲得的最佳聲譽:它已經存在了相當長的一段時間,被廣泛使用,“吸引了人們的注意”,但至今仍保持不變。

為什麼bcrypt比PBKDF2更好

如果仔細研究一下情況,您實際上可以看到bcrypt比更好的一些地方,例如 PBKDF2。 Bcrypt是旨在降低速度的密碼哈希功能。確切地說,我們希望密碼散列函數對於攻擊者來說盡可能慢,而對於誠實的系統而言,又不能讓它們慢得難以忍受。由於“誠實的系統”傾向於使用現成的通用硬件(即“一台PC”),攻擊者也可以使用它們,因此我們希望最好的方法是使密碼散列 N 攻擊者和我們的速度都慢了兩倍。然後,我們調整 N 以便不超出我們的資源(其中大部分是用戶的耐心,這確實是有限的)。

我們要避免的是攻擊者可能使用一些非PC硬件,這將使他從bcrypt或PBKDF2隱含的額外工作中所受的痛苦比我們少。特別是,勤奮的攻擊者可能想要使用 GPU FPGA。例如,SHA-256可以非常有效地在GPU上實現,因為它僅使用GPU擅長的32位邏輯和算術運算。因此,擁有價值500美元的GPU的攻擊者每小時可以“嘗試”更多的密碼,這比擁有價值500美元的PC可以做到的多(密碼的比率取決於GPU的類型,但是比率是10倍或20倍)是典型的)。

Bcrypt恰好嚴重依賴對錶的訪問,該表在整個算法執行過程中不斷變化。這在PC上非常快,而在GPU上則更快,在GPU上,內存是共享的,並且所有內核都爭奪內部內存總線的控制權。因此,與使用PBKDF2或類似設計的攻擊者相比,攻擊者使用GPU所獲得的提升被大大降低了。在分組密碼 Blowfish中設計了bcrypt,而不是SHA- *函數。他們在他們的文章中指出了以下內容:

這意味著應該對任何密碼功能都盡可能有效地進行設置。 crypt的設計者未能做到這一點。他們基於DES的加密算法,由於許多位轉置,因此在軟件中實現效率極低。他們抵制了硬件攻擊,部分原因是無法使用現有的DES硬件來計算加密。不幸的是,Biham隨後發現了一種稱為位片的軟件技術,該技術消除了在計算許多同時進行的DES加密時的位轉置成本。雖然分片並不能幫助任何人更快地登錄,但它提供了驚人的加速暴力破解密碼的功能。

這表明硬件被使用很重要。即使與誠實係統使用同一台PC,攻擊者也可以使用位片並行嘗試多個密碼並從中獲取更多幫助,因為攻擊者擁有可以嘗試多個密碼,而誠實係統卻具有一次只能一次。

為什麼bcrypt不能達到最佳安全性

bcrypt的作者在1999年工作。當時,這種威脅是定制的 ASIC,其門數非常少。時代變了;現在,老練的攻擊者將使用大型FPGA,而較新的模型(例如,Xilinx的Virtex)具有嵌入式RAM塊,從而使它們能夠非常高效地實現Blowfish和bcrypt。 Bcrypt僅需要4 kB的快速RAM。儘管bcrypt在提高GPU攻擊者的生活難度方面做得不錯,但對使用FPGA的攻擊者卻無濟於事。

這促使Colin Percival在2009年發明了 scrypt ;這是一個類似於bcrypt的函數,需要更多的RAM。這仍然是一個新設計(僅兩年),幾乎沒有bcrypt普及。我認為它太新了,不建議一般推薦。但應遵循其職業生涯。

編輯:)scrypt證明沒有完全兌現其諾言。從根本上講,它對設計目標有利,例如,保護計算機主硬盤的加密密鑰:這是一種使用上下文,其中哈希可以使用數百MB的RAM和價值幾秒鐘的CPU。對於驗證傳入請求的繁忙服務器,CPU預算非常大較低,因為服務器需要能夠同時處理多個並發請求,並且在偶爾的峰值負載下不能減慢爬網速度;但是當scrypt使用更少的CPU時,它也使用更少的RAM,這是該功能的一部分內部定義。當散列計算必須在幾毫秒內完成時,使用的RAM量太低,從技術上講,scrypt變得比bcrypt弱。)

NIST的建議

NIST已針對存儲散列密碼的問題發布了 Special Publication SP 800-132。基本上,他們推薦PBKDF2。這並不意味著他們認為bcrypt不安全;他們對bcrypt一無所獲。這只是意味著NIST認為PBKDF2“足夠安全”(當然, 比簡單的哈希好得多!)。而且,NIST是一個管理組織,因此它們必然會喜歡基於SHA-256之類的“已批准”算法的任何內容。另一方面,bcrypt來自Blowfish,它從未收到過任何NIST的祝福(或詛咒)。迭代次數“很高”),那麼密碼存儲就不再是最嚴重的安全問題了。

什麼是“高”迭代計數?而且我不太明白為什麼您仍然建議在PBKDF2上使用bcrypt
TL; DR:bcrypt比PBKDF2更好,因為使用GPU可以更好地加速PBKDF2。因此,PBKDF2可以更輕鬆地通過消費類硬件進行脫機暴力破解。
@ExplosionPills對於“高”迭代次數,我的經驗法則是:盡可能大,而不會引起太多用戶抱怨延遲。我通常在生產服務器輕載時將bcrypt / pbkdf2調整為在生產服務器上花費250-500ms(對於管理員帳戶為1-2s)。這項政策似乎可以追踪OpenBSD推薦的bcrypt設置,以及我發現的任何其他與上下文相關的建議。
沒有關於scrypt的消息? :)
@EliCollins:我在這裡很好奇-使用較高的迭代計數是否可以引入針對服務器的DDOS攻擊?例如,如果我要同時向服務器發布數百次登錄嘗試,則嘗試對所有密碼進行哈希運算會立即使服務器不堪重負。有辦法避免這種潛在問題嗎?
@GeorgeEdison我也一直在想這個問題,但沒有找到一個好的答案。 1)您可以根據負載對登錄頁面進行速率限制,但是擴展性不佳。 2)將哈希值卸載到單獨的服務器上,因此DDOS僅影響並發登錄,但這只是選項1的變體。3)使用隨機數(例如csrf令牌)添加[hashcash](http:// en。 wikipedia.org/wiki/Hashcash)風格的工作證明(用於登錄),但這對殭屍網絡沒有多大幫助。 4)DDOS首先必須找到一個有效的用戶帳戶,因此請使用sleep()調用來延遲無效用戶錯誤以匹配哈希時間。
@GeorgeEdison避免DDOS在檢查密碼之前檢查用戶名。然後,如果該用戶連續多次嘗試登錄失敗(例如,其中10次嘗試),則拒絕該密碼,甚至不檢查密碼,除非該帳戶已“冷卻”幾分鐘。這樣,一個帳戶可以是DDOS帳戶,但不能是整個服務器帳戶,而且即使不使用脫機攻擊也無法暴力破解甚至是非常弱的密碼。
@AbhiBeckert如果合法用戶在受到殭屍網絡攻擊的情況下嘗試登錄時會被捕獲,該怎麼辦? (答案:DOS)。此外,跳過對錯誤用戶名的密碼檢查會提供一個基於時間的預告片,它告訴攻擊者哪些帳戶存在。如果您保留用於成功登錄的IP(有充分的理由不這樣做),則即使用戶名被“鎖定”,也可以為這些IP賦予優先級並檢查密碼。
NIST的祝福並沒有像以前那樣重。 http://www.wired.com/threatlevel/2013/09/nsa-backdoor/all/(我懷疑這適用於PBKDF2,但值得深思。)
@TerisRiel我不介意用戶帳戶是否由於DOS攻擊而脫機。在現實世界中,這實際上並沒有發生,如果發生了……那比被黑客入侵的帳戶要好。
當然,對於DOS用戶,他們將收到一些警告,警告他們發生了某些事情(如果像@Abhi Beckert所說的那樣,甚至在現實生活中發生過)。通過將任何失敗的用戶名休眠一定時間來檢查密碼,從而避免oracle攻擊。
scrypt還是太新而無法使用?
事實證明,@JanusTroelsen:的scrypt效果不如預期。我在答案中添加了適當的段落。
BCrypt現在似乎已被破解-這會影響答案嗎? http://www.itproportal.com/2015/09/11/11-million-unbreakable-ashley-madison-passwords-broken/
您看錯@MatthewMartin:的文章了-bcrypt根本沒有被破解;被攻擊的密碼被哈希兩次,一次是使用bcrypt,一次是使用自製的,對MD5的弱調用。研究人員破壞了基於MD5的弱自製哈希值(也就是說,他們沒有“破解”它,他們只是嘗試了很多密碼直到找到匹配項為止,這很快,因為自製哈希值非常高而且沒有鹽分)。
-1
在@corsiKa:中,更多的情況是兩個開發人員使用相同的用戶密碼,但彼此不交談;一個知道bcrypt是什麼,另一個不知道。這是一條通用規則的情況:如果攻擊者可以選擇兩種方式來獲取他所尋求的信息,那麼他將為他選擇最簡單的方法。
這個答案在2016年是最新的嗎?例如,與PBKDF2,bcrypt等相比,Argon2(贏得了密碼哈希競賽)如何保持?由於這是一篇廣為閱讀的文章,因此最好定期查看此答案的更新,以重申其相關性或更新其建議。
@ThomasPornin我覺得Argon2上的一段將是這個已經很好的答案的基礎。
@joshreesjones我認為這值得一個單獨的問題,因為該問題和答案專門與bcrypt有關。
您的巡演完成了嗎?
根據建議,應該首先檢查用戶名,然後在用戶名不存在時快速失敗-這意味著攻擊者可以了解哪些用戶名存在而哪些不存在。為了避免洩漏,您希望每個密碼檢查都具有相同的時間長度。
@MikkoRantalainen現代GPU(即使在2012年,您撰寫該評論時)也可以輕鬆處理bcrypt。要求是4 KiB的快速存儲。這意味著每個GPU著色器至少需要從全局內存池分配給它那麼多的內存。具有500個著色器和1 GiB VRAM的GPU將能夠為每個著色器提供** 2 MiB **的完整內存。即使是具有256 MiB VRAM(非常低)的內存,也可以為500個著色器分配比bcrypt所需內存多100倍的內存。現在,另一方面,ASIC ...
@forest bcrypt和GPU的重點並不是bcrypt需要大量內存。如果您需要花費大量內存,請參閱scrypt。bcrypt算法是關於RAM的隨機訪問,這不是GPU的強項。較新的GPU的問題較少,但PBKDF2對於GPU而言仍然是比較容易的任務。
@MikkoRantalainen隨機訪問是否嚴重依賴於密鑰?即使GDDR5內存的延遲比DDR3或DDR4高,對單個4 KiB頁面的內存進行隨機訪問似乎對於GPU來說也不是特別困難。
@forest我不確定訪問模式是否取決於密鑰。根據https://github.com/freedomofpress/securedrop/issues/180#issuecomment-29662610 https://www.usenix.org/system/files/conference/woot14/woot14-malvoni.pdf https:// crypto。stackexchange.com/a/401/1267和https://crypto.stackexchange.com/a/35352/1267,看來GPU的偽隨機訪問模式存在問題,這些偽隨機訪問模式“修改”了內存,結果GPU的運行速度並不快bcrypt而不是價格相同的CPU。
@MikkoRantalainen哦,這很有趣!因此,似乎每個內核組都有自己的共享內存(非常快)以及主內存(對於並發訪問來說很慢)。至少在2011年,共享內存太小,無法容納4 KiB。我想知道對於任何現代GPU來說這是否已經改變。
另請參見:“氣球哈希:一種可記憶的功能,可提供針對順序攻擊的可靠保護” https://eprint.iacr.org/2016/027.pdf(尤其是第5章)
我是菜鳥有人告訴我為什麼我不應該先共享密碼然後再通過bcrypt或scrypt運行它。如果大多數互聯網都沒有這樣做,那麼沒有攻擊者會檢查兩者。
Giu
2010-09-16 12:39:02 UTC
view on stackexchange narkive permalink

bcrypt相對於簡單鹽醃SHA-256哈希具有顯著優勢:bcrypt使用改良的密鑰設置算法,該算法適時昂貴。這稱為密鑰加強,它使密碼對於暴力攻擊更為安全,因為攻擊者現在需要更多時間來測試每個可能的密鑰。

在博客文章“ Enough With”中我個人建議您閱讀“彩虹表:安全密碼方案需要了解的信息”,作者兼安全研究人員Thomas Ptacek建議使用bcrypt。

個人,最近我一直在研究 PBKDF2,這是一個密鑰派生函數,它將偽隨機函數(例如,密碼哈希)與鹽一起應用於輸入密碼,然後通過重複指定的過程多次。儘管它是密鑰派生功能,但它以密鑰增強為核心,這是決定如何安全地生成密碼哈希時應努力的許多事情之一。

引用以上鍊接文章中的Thomas Ptacek:

速度正是您在密碼哈希函數中所不想要的。

bcrypt的基本假設是它運行緩慢,但這只是一個假設,可能存在一個弱點,可以大大縮短執行時間,或者硬件演進可以繞過該慢點(與Scrypt相同)。另一方面,PKBDF依賴於經過良好測試的哈希,對於該哈希,已經存在相當快的近乎最佳的硬件,這意味著時間和復雜性參數是眾所周知的(並且可以通過重複利用)。 PKBDF防御者確切知道攻擊者可以在一個數量級內做什麼,而bcrypt防御者則不知道。
-1
@EricGrange對於所有算法都是如此。隨著時間的流逝和更多的密碼分析的完成,我們可以變得越來越有信心(但永遠不能完全確定)特定算法沒有特定的弱點。我們可以肯定地知道PBKDF2但沒有bcrypt的風險的想法是荒謬的。
根據https://www.usenix.org/system/files/conference/woot14/woot14-malvoni.pdf的描述,使用定制硬件的攻擊者的速度僅比使用通用i7 CPU的bcrypt防禦器快2倍。似乎比攻擊者要好得多,使用PKBDF的速度要比防御者快10到20倍。
Steven Sudit
2010-09-18 06:51:13 UTC
view on stackexchange narkive permalink

我認為Gui提出的有關PBKDF2的建議是值得的,儘管我知道Rook強烈不同意。

無論如何,與HMAC-SHA256相比,沒有理由使用鹽醃的SHA-256哈希。 HMAC具有阻止擴展攻擊的優勢。

+1代表HMAC,我完全忘了提及它,因為它是簡單添加鹽分的SHA-256哈希的更安全替代方案。長度擴展攻擊是眾所周知的。 Flickr API曾經遭到破壞,因為它曾經使用MD5(秘密+參數列表)來簽名API調用(請參閱“ [Flickr的API簽名偽造漏洞](http://netifera.com/research/flickr_api_signature_forgery.pdf)” PDF]以獲取更多信息)
HMAC與不可恢復的密碼存儲有何關係?
@curiousguy(遲到總比沒有好...)可以通過使用密碼作為HMAC來計算[HMAC](http://en.wikipedia.org/wiki/Hash-based_message_authentication_code),從而存儲用鹽散列的密碼。密鑰和鹽作為HMAC消息。這比幼稚地計算“ H(salt || password)”更安全,儘管最好使用像bcrypt這樣的實際密碼哈希函數。
@curiousguy HMAC是PBKDF2中最常用的PRF。因此,也不要使用裸HMAC。使用PBKDF2(與HMAC-SHA256或HMAC-SHA512一起使用),bcrypt或scrypt。而已。不要發明或使用其他任何東西。自定義方案注定是錯誤的。這三個經過嚴格審查,易於使用。意識到PBKDF2最容易受到硬件加速字典攻擊,而scrypt最不容易受到攻擊。
PBKDF2
2012-07-11 21:30:35 UTC
view on stackexchange narkive permalink

NIST是總部位於美國的政府組織,因此遵循FIPS(美國)標準,該標準不包括河豚,但包括SHA-256和SHA-512(甚至包括用於非數字簽名的SHA-1)應用程序,甚至在NIST SP800-131A中也說明了每種較舊的算法可以用於多長時間)。

對於任何需要遵守美國NIST或FIPS標準的業務,bcrypt都不是有效的選擇。當然,如果您在當地開展業務,請分別查看每個國家的法律法規。

PBKDF2很好;真正的訣竅是在誠實的服務器中獲取Tesla(基於GPU)卡,以便可以使迭代足夠高,以與基於GPU的破解程序競爭。對於2012年的PBKDF2, OWASP建議在其 Password Storage Cheat Sheet(密碼存儲備忘單)上至少進行64,000次迭代,每2年翻一番。

在我看來,使用scrypt或bcrypt(更改軟件)比向數百萬台服務器添加昂貴的硬件(就前期成本和能源成本而言)要容易得多。在更高級別上,任何鍵擴展功能都只是嘗試為密碼添加更多的熵。如果(且僅當)密碼足夠強大以開頭(例如,編碼為10個diceware字的128位隨機數),則PBKDF2的一次迭代就足夠了。
* crypt函數或PBKDF2的目的是將密碼存儲在非常難以找到原始密碼的地方。它們不會使密碼變得更強。 PBKDF2的一次迭代使您很容易用暴力猜測密碼是什麼。如果每次猜測花費一秒鐘的CPU時間,那麼強行使用就變得不切實際。
GPU無法幫助網絡服務器快速哈希一個或幾個密碼。它僅有助於同時散列許多(數千個)密碼。
當bcrypt在本地更難以暴力破解時,NIST怎麼會認為PBKDF2很好?這是否意味著,如果您擁有使用`bcrypt`加密的服務,那麼將不允許美國企業使用該服務?
NSA可能會向NIST施加壓力以引入後門程序(例如https://www.wired.com/2013/09/nsa-backdoor/)。警惕NIST的建議,並始終與獨立學者進行仔細檢查。
David C. Bishop
2016-01-07 04:18:25 UTC
view on stackexchange narkive permalink

值得一提的是贏得了密碼哈希競賽的Argon2。

歡迎參加信息安全堆棧交換。由於此答案不能直接解決bcrypt,因此最好將其留為註釋。感謝您抽出寶貴的時間回答問題,希望您在這裡能獲得積極而有益的經驗!
我看了一下這場比賽,候選人的[列表](https://password-hashing.net/submissions.html)不包括bcrypt,scrypt和PBKDF2。
@AmirForsati-它包括bcrypt(河豚)和scypt(yescrypt)的派生詞。可能/可能也來自PBKDF2,但我沒有仔細研究其中的大部分內容。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 2.0許可。
Loading...