Scrypt 不夠“老”以保證安全?
我只是檢查了所有帶有 scrypt 標籤的問題,通常都說 scrypt 在理論上很好,理論上比 bcrypt 和 PKDF2 更好,但它還太年輕,不能“完全安全”。
我知道 bcrypt 已經很老了,但仍然完好無損,但是由於它使用的 RAM 數量相對較少,因此破解者可以使用專門的硬體繞過它。另一方面,scrypt 使用了“更多”的記憶體(在一定程度上是可配置的),並試圖解決 bcrypt 使用這麼少記憶體的問題。
所以主要的問題是,如果腳本還不夠“安全” ——scrypt 什麼時候才能安全地正確使用?也許更重要的是:哪些因素會影響“足夠老”,以便我可以判斷像 scrypt 這樣的東西是否和/或何時已經足夠安全,可以安全地用於實際的加密使用?
實際上,事實證明 scrypt 在所有條件下都沒有最初宣傳的那麼好。
Scrypt 旨在支持基於密碼的密鑰派生的特定情況,以實現全硬碟加密。基本上,您在機器啟動(或從休眠狀態喚醒)時輸入密碼。這是適用以下情況的上下文:
- 密碼處理時間可能需要幾秒鐘,因為它是啟動過程的一部分,需要更多時間;在這種情況下,使用者的耐心是這樣的,5秒的專用時間並不是一個不合理的數字。
- 在處理密碼時,機器上不會發生任何其他事情,因此可以使用完整的 CPU 以及完整的 RAM(最多千兆字節)。
在這種情況下,scrypt 完全規則。然而,一個繁忙的認證伺服器,例如一個活躍的 Web 伺服器,可能是一個不同的野獸。特別是,您可能希望使每個密碼的 CPU 成本大大降低,這不僅是因為可能有多個使用者同時處理其他任務,而且還因為密碼散列成本越高,您就越容易受到攻擊基本的拒絕服務攻擊。對於繁忙的伺服器,計算時間降低到 1 毫秒左右將是比上面提到的“5 秒”更合理的值。
當 scrypt 必須快速執行時,它不能使用盡可能多的 RAM。事實上,在 1 毫秒的 CPU 時間下,它使用的 RAM 非常少,以至於基於 GPU 的優化變得值得付出努力。在萊特幣中,scrypt 與 128 kBytes 的 RAM 一起使用,GPU 實現可以比 CPU 實現快約 10 倍(對於相同的硬體/運營成本),這在技術上是一個功能故障。密碼散列函式的要點之一是使用 GPU 的攻擊者不應獲得優於使用“普通”CPU 的防御者的優勢。對於快速密碼散列,bcrypt 因此證明比 scrypt**更安全。**雖然 scrypt 在用於其設計用途時比 bcrypt 更好。
scrypt 的另一個問題是它允許時間-記憶體權衡:使用更多 RAM,您可以節省 CPU,反之亦然。這種靈活性為試圖優化其努力的攻擊者提供了一些籌碼。
您可能需要查閱此展示文稿以獲取一些解釋和指向更多資訊的指針。原始結論是,雖然 scrypt 的功能相當不錯,但不能說它是對 bcrypt 的直接改進。
(作為旁注,請注意,在加密貨幣中使用密碼散列函式與在身份驗證伺服器中保護密碼的上下文不同。在身份驗證伺服器中,攻擊者和防御者之間存在不對稱競爭,因為防御者使用通用硬體,攻擊者可以購買專用硬體。在加密貨幣中,礦工相互競爭,無論如何他們都購買相同的 GPU 或 ASIC,因此萊特幣的 10 倍 GPU 加速對萊特幣來說不是問題; 另一方面,對於身份驗證伺服器來說,這將是一個問題,防御者必須使用他可以從託管服務提供商處獲得的任何 PC。)
這樣的事情促使密碼學家尋找更好的密碼散列函式,他們按照通常的安排這樣做:公開競爭(*)。這導致了密碼雜湊競賽。這個過程花了幾年時間,最終選出了一個名為Argon2的“贏家” (以及其他四個“特別認可”的方案)。
目前的情況並不理想,因為我們現在有以下選擇:
- 舊的 bcrypt,除了針對那些想得很大並使用 FPGA的非常嚴重的攻擊者外,它相當不錯;
- 較新的 scrypt,在某些情況下比 bcrypt 更好,但在其他情況下更差,並且有一些額外的缺點;
- 全新的 Argon2,經過了一些相當嚴格的審查,但時間有限,因此還不能被普遍推薦。
好的一面是 PHC 似乎激發了對 Argon2 的額外研究,這很好。
(*) 對於密碼學家來說,最完美的學術研究過程是 Thunderdome。