Bcrypt 和密碼哈希簡史
以下文章簡要介紹了密碼哈希以及與算法同步的密碼破解軟件的發(fā)展歷程。
翻譯自 Bcrypt and a Short History of Password Hashing 。譯者對這種歷史很感興趣。

來自 Pixabay 的 Gordon Johnson 的特色照片
作為廣泛使用的 bcrypt 密碼哈希庫的創(chuàng)建者,Niels Provos 發(fā)現(xiàn)我們這些身處互聯(lián)網(wǎng)上的人仍然嚴(yán)重依賴密碼,這讓他感到驚訝。這是我第一次考慮到可能存在更好的選擇。
以下文章是密碼哈希和跟進(jìn)算法的密碼破解軟件的簡要?dú)v史。在密碼哈希出現(xiàn)之前,密碼只是以明文形式存儲(chǔ)在密碼數(shù)據(jù)庫中。我們已經(jīng)走了很長的路程,但還有很多工作要做。bcrypt 的創(chuàng)建者 Niels Provos 為 Usenix 撰寫了一篇引人入勝的博客文章,其中包含了他的專業(yè)知識(shí)、建議和對未來的預(yù)測。
密碼哈希起源于 Unix ,像大多數(shù)事物一樣。Crypt 是 Unix 的哈希函數(shù)。Robert Morris 在 Unix 的第六版中發(fā)布了 Crypt 。Crypt 基于 Hagelin 密碼機(jī)(M-209)。Crypt 從未沒有問題。開發(fā)人員在第七版中重新發(fā)布了 Crypt ,加入了 12bit salt,并采用迭代的數(shù)據(jù)加密標(biāo)準(zhǔn)(DES)密碼算法來從用戶的密碼創(chuàng)建哈希。Salt 創(chuàng)建了 2^12 個(gè)不同的哈希函數(shù)族,每個(gè)用戶從中隨機(jī)選擇一個(gè)用于其密碼。
隨著 salt 的引入,密碼始終是唯一的,即使原始密碼相同,預(yù)先計(jì)算的哈希攻擊也被阻止。這標(biāo)志著明文密碼存儲(chǔ)的終結(jié)?,F(xiàn)在,salt 和哈希密碼被存儲(chǔ)在密碼文件中用于用戶認(rèn)證。盡管 Crypt 當(dāng)時(shí)是具有開創(chuàng)性的,但它最終變得過時(shí)。
Bcrypt
1997 年的密碼哈希已經(jīng)不再足夠?;ヂ?lián)網(wǎng)開始騰飛,家用計(jì)算機(jī)房間隨處可見,數(shù)據(jù)泄露也隨之而來。為此, Provos 希望創(chuàng)建“一個(gè)能夠抵抗計(jì)算能力迅速增強(qiáng)的算法”。他成功了,我們?nèi)栽谑褂?bcrypt 。
Bcrypt 的一個(gè)關(guān)鍵貢獻(xiàn)來自 David Mazieres ,他引入了可調(diào)節(jié)的成本因素。適應(yīng)性哈希使得暴力破解和字典攻擊變得越來越耗費(fèi)資源,這是可調(diào)節(jié)成本因素的結(jié)果。
這意味著 bcrypt 可以跟上計(jì)算能力的進(jìn)展。內(nèi)存硬性和可調(diào)節(jié)并行性的引入是為了應(yīng)對在專用硬件(如 GPU )上的密碼猜測。內(nèi)存硬性增加了密碼猜測的難度,因?yàn)槊看尾聹y都需要大量內(nèi)存??烧{(diào)節(jié)并行性允許算法利用多個(gè)處理核心,進(jìn)一步增加計(jì)算成本,減少通過并行猜測密碼所獲得的效率。

?密碼哈希函數(shù)及其隨時(shí)間演變的安全性比較表(Usenix)
今天的哈希景觀
我們已經(jīng)遠(yuǎn)離明文密碼存儲(chǔ)的時(shí)代。現(xiàn)在,隨著所有這些新的高級技術(shù),黑客需要更多的步驟。要竊取密碼,他們必須正確地猜測密碼,對其進(jìn)行哈希,并將其與加密的密碼數(shù)據(jù)庫進(jìn)行比較。但或許并不令人驚訝的是,人類是可預(yù)測的。密碼的可預(yù)測性稍微降低了密碼猜測的復(fù)雜性。有一些密碼猜測工具依賴于這種可預(yù)測性,它們宣稱可以猜測常見密碼并與哈希密碼進(jìn)行比較。對于那些在多個(gè)網(wǎng)站上使用類似 "pas$w0rd" 這樣的密碼的人來說,這點(diǎn)需要引起警惕。
當(dāng)然,哈希技術(shù)越來越好,但破解技術(shù)也在不斷進(jìn)步。我們不是在談?wù)撘恍┚幼≡谀赣H地下室里的家伙,雖然我敢肯定有很多這樣的人。這些工具絕非輕視。密碼破解工具呈指數(shù)增長。曾經(jīng)每秒處理 45 個(gè)密碼的速度,現(xiàn)在已經(jīng)達(dá)到每秒 63 億個(gè)密碼。
1978年:PDP-11/70(模擬 M-209 的 crypt )→ 800個(gè)密碼/秒
1988年:VAX 8600(優(yōu)化的 des-crypt ,用于 Morris-worm )→ 45個(gè)密碼/秒
1994年:60MHz Pentium(基于 MD5 的 crypt )→ 29.41 個(gè)密碼/秒
1999年:John the Ripper(基于位切片的 DES-crypt )→ 214,000 個(gè)密碼/秒
1999年:John the Ripper(使用工作因子 5 的 bcrypt )→ 62.5 個(gè)密碼/秒
2018年:Hashcat(基于 GPU 的 des-crypt )→ 17 億個(gè)密碼/秒
2018年:Hashcat(基于 GPU 的 MD5 哈希)→ 454 億個(gè)密碼/秒
2018年:Hashcat(基于 GPU 的 SHA-1 哈希)→ 146 億個(gè)密碼/秒
2018年:Hashcat(使用工作因子 5 的基于 GPU 的 bcrypt )→ 4.72 萬個(gè)密碼/秒
2018年:Hashcat(基于 GPU 的 scrypt )→ 140 萬個(gè)密碼/秒
2022年:Hashcat(基于 RTX 4090 GPU 的 des-crypt )→ 63 億個(gè)密碼/秒
2022年:Hashcat(使用工作因子 5 的基于 RTX 4090 GPU 的 bcrypt )→ 18.4 萬個(gè)密碼/秒
未來發(fā)展方向
貓捉老鼠的游戲?qū)⒗^續(xù)進(jìn)行?,F(xiàn)代密碼哈希技術(shù)降低了暴力破解密碼的有效性,但事情并未就此結(jié)束?,F(xiàn)在出現(xiàn)了“密碼堆積”( password stuffing )的攻擊方式,攻擊者利用之前泄漏的憑據(jù)來獲取入口。諸如限制頻率、驗(yàn)證碼(哇,它們確實(shí)有用)、多因素認(rèn)證(MFA)等工具在大大遏制了攻擊方面發(fā)揮了重要作用。云服務(wù)意味著現(xiàn)在有許多重要數(shù)據(jù)存儲(chǔ)和遠(yuǎn)程處理。確保安全進(jìn)入依然至關(guān)重要。
接下來怎么辦?為什么仍然會(huì)發(fā)生數(shù)據(jù)泄露,我們該做些什么?現(xiàn)在是自我反思的時(shí)候。Provos 認(rèn)為問題出在我們身上。他巧妙地說:“大多數(shù)安全挑戰(zhàn)在技術(shù)上都有解決方案,減少數(shù)據(jù)泄露的主要問題歸結(jié)為人為因素和采用現(xiàn)有安全技術(shù)的成本?!辈煌娜税缪葜煌慕巧S行┕緸榱似渌胤降幕ㄉ诠δ芏?jié)省了頂級安全性。內(nèi)部風(fēng)險(xiǎn)是另一類問題。這包括社交工程、不滿的員工和無知。最后,存在技能鴻溝。
結(jié)論
密碼是我們數(shù)字生活中不可或缺的一部分。它們的部署、創(chuàng)建和撤銷都很方便。但它們也是有風(fēng)險(xiǎn)的。要聰明地使用密碼,自擔(dān)風(fēng)險(xiǎn),并且為了這個(gè)世界上所有美好的事物,不要使用任何含有 "password" 一詞的密碼。
本文使用 文章同步助手 同步