可以有效地迭代有效的 bcrypt 雜湊輸出值嗎?
bcrypt是一種故意慢速散列算法。在我上一個協議的想法中,我想用它來擴展密碼,然後只傳輸 bcrypt-hashed 密碼。
對此的有效攻擊是能夠迭代所有 bcrypt 雜湊(或者僅來自字典中的密碼,也許 $ 2^{12} $ 那些)沒有實際加密密碼。
bcrypt 的輸出包括安全參數(一個整數)、使用的 salt(128 位)和實際雜湊(192 位),這是 ASCII 字元串 64 次迭代 Blowfish ECB 加密的結果
"OrpheanBeholderScryDoubt"
,其中密鑰和s-box 是由(昂貴的)EksBlowfishSetup 而不是正常的 BlowfishSetup 創建的。假設我們有一個相當高的安全參數,比如 12(意味著 $ 2^{12} $ 設置階段的迭代)。
為了更容易,假設鹽是固定的,或者我們想為所有鹽列舉所有有效的實際散列(不注意哪個鹽用於哪個散列)。
是否有任何方法可以在不實際執行 bcrypt 算法或列舉整個 192 位輸出空間的情況下列舉所有雜湊?
我所看到的只是在對每個此類狀態進行 64 次加密之前列舉所有可能的河豚狀態(例如子密鑰 + S-box)。但如果我理解正確的話,這種狀態包括 $ 576 $ 位 P 數組(子鍵),和 $ 4·265·32=32768 $ S盒位。這是一個比散列輸出空間大得多的空間( $ 192 $ 位),因此我們可以簡單地假設每個可能的散列至少發生在一個這樣的狀態,並簡單地列舉整個 $ 192 $ 位空間。不是真正的勝利。
bcrypt 使用Blowfish,它是一種分組密碼(儘管密鑰表要大得多)。因此,Blowfish 實現了 64 位塊空間的排列;並且應該沒有辦法將 Blowfish(使用隨機密鑰)與以均勻機率隨機提取的排列與 64 位塊上的排列集(有 $ 2^{64}! $ 這樣的排列)。
到目前為止,關於精確區分 Blowfish 和隨機排列的最佳密碼分析結果歸功於Vaudenay :如果輪數減少到 14( “正常”河豚從 16 開始)。對完整的 Blowfish 沒有攻擊,即使有,也只是關於弱鍵(大約一個鍵在 $ 2^{15} $ 弱)。
因此,我們無法猜測有關 Blowfish 實例的任何資訊,這不適用於隨機選擇的排列。這仍然允許一個小評論:由於這是 ECB 加密,即三個不同的64 位塊的加密,我們知道雜湊結果必須由三個不同的64 位塊連接在一起。這意味著可能的雜湊值的空間有大小 $ 2^{64}(2^{64}-1)(2^{64}-2) $ ,即 $ 2^{192}-3\cdot2^{128}+2\cdot2^{64} $ ,即非常略低於 $ 2^{192} $ (但數量不多)。
您的問題中比較棘手的部分是關於繞過關鍵時間表。bcrypt 的目的是讓攻擊者處理單個密碼的速度盡可能慢,但對於誠實的系統來說,速度不會太慢。在這裡使用 Blowfish 是一個好主意:Blowfish 的關鍵調度針對具有幾 KB 快速 RAM 的系統進行了優化,即 PC。在 FPGA 或 ASIC 上實現 Blowfish 將是一次痛苦的經歷;並且 RAM 要求也可能會損害GPU的性能。這仍然要求密鑰調度本身不適合攻擊者可能使用的隱藏優化。據我所知,bcrypt 中使用的“擴展密鑰計劃”的安全性沒有已知結果。
請注意,該算法屬於使用自修改查找表的類型,例如MD2和RC4,眾所周知,這些查找表難以分析:我們無法從差分或線性密碼分析等常用工具中受益。事實證明 MD2 和 RC4 有弱點,但花了很多時間,目前沒有任何跡象表明 Blowfish 可能有這樣的弱點。我們仍然缺乏一個合適的數學框架來討論這種結構的安全性。因此,沒有公佈的結果只是意味著沒有人發現真正的突破;這並不意味著有已知的原因說明這種中斷可能存在也可能不存在。我的感覺是 bcrypt 中使用的擴展密鑰計劃對於它的用途是穩健的(即,對於每個密碼猜測,不可避免的大量計算)。
所以我對你的問題(“有什麼方法……”)的回答是:沒有。