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的祝福(或詛咒)。迭代次數“很高”),那麼密碼存儲就不再是最嚴重的安全問題了。