基於迭代散列的密碼有多不安全?
我只是想知道以下構造如何不安全。我可以說已知的普通攻擊是可能的,但我不確定其他任何事情。
讓使用者選擇一個密碼並使用具有像 SHA-256 之類的原像抗性的東西對其進行足夠多的雜湊處理。將明文與散列進行異或。再次散列雜湊。將結果與下一個明文塊進行異或運算……依此類推,直到結束。對手如何能夠打破這一點?
TL;博士; 不安全的不要使用它。使用標準和眾所周知的操作模式。
你的建築是 $ s_i = H^i(password) $ 即散列密碼 $ i $ 次然後使用輸出 $ s_i $ 對於每一步到 x-or 與明文到達密文; $ c_i = p_i \oplus s_i $
對手如何能夠打破這一點?
有辦法實現這一點
- 猜測攻擊:如果有人得到你消息的一部分,比如完整的 SHA-256 塊的至少 256 位,那麼其餘的消息很容易被解密。所以這裡沒有前向保密。.
人們應該看看這些關於Hash_DRGB的幻燈片,看看一種更好的設計來對抗狀態妥協。在產生目前狀態的偽隨機序列折衷時,不得洩漏其他狀態。提議的設計的主要失敗是這個。
- 您的方案似乎很容易受到**禁止的攻擊**,當 $ (IV,key) $ CTR模式的pair resue會破壞密文的機密性。您沒有在方案中定義 IV,因此您將擁有相同的密碼,並且您的密碼生成的流將始終產生相同的輸出。
要麼必須在每次加密時更改密碼,要麼必須引入標準 IV 實踐來緩解,否則厄運!
- 密碼安全性無法驗證,我們通常使用 PBKDF2、Scrypt 或 Argon2 等基於密碼的密鑰派生函式來從密碼中獲取隨機性。這些至少提供了迭代計數以減輕密碼搜尋攻擊。它們還具有記憶體束和執行緒數,以降低密碼搜尋攻擊的能力。由於您的方案容易受到禁止攻擊,因此使用者很難為每次加密選擇新密碼。
相反,我們使用隨機密鑰,這些密鑰要麼在本地生成以供使用,要麼從 DHKE 等協議派生而來。
- 您的方案的安全性高度依賴於密碼的安全性,這將是一個很好的攻擊點,因為一般使用者無法獲得和管理好的密碼。儘管可以使用類似骰子線的密碼來生成強度約為 256 位的密碼,但加密程度越高,記住越多的密碼將變得不可行。相反,使用一個好的密碼並派生一個加密密鑰來加密您的方案的隨機輸入是更好的選擇。
對於本地加密,通常的做法是;為每個文件生成一個隨機文件加密密鑰 FEK。然後使用使用者的密碼導出具有良好 PBKDF(如 Argon2)的密鑰加密密鑰 (KEK)。使用 KEK 加密和解密 FEK,然後加密/解密文件。更多細節在這裡。
- 您的方案缺少隨機訪問,因此對於磁碟加密等許多應用程序沒有用處。
- 您只要求抗原像性,但是,您還需要抗碰撞性。如果在生成的流上很容易發生衝突,那麼它將重複自身,這是一個攻擊點。至少您的流不會是偽隨機序列。幸運的是,SHA-256 具有抗碰撞性,預期循環範圍很大;
假設 SHA-256 模型為均勻隨機函式,則元素在循環中的機率為
$$ \frac{1}{\sqrt{\hspace{.03 in}2\hspace{-0.05 in}\cdot \hspace{-0.04 in}\pi} \cdot 2^{127}} $$
具有 SHA-256 期望值的平均循環長度為$$ 2^{127} \sqrt{2\pi} $$因此,您不必擔心短週期。參考是哈里斯,1960
- 您的方案沒有 Ind-CPA 安全性。
我們有什麼來代替這個?
自 1979 年以來,我們擁有著名的 CTR 模式,可以將任何偽隨機函式 (PRF) 轉換為加密方案。它是 Whitfield Diffie 和 Martin Hellman 的開創性論文;
- Privacy and Authentication: An Introduction to Cryptography as an Introduction to Cryptography as an Introduction to Cryptography as an Introduction to Proceedings of the IEEE, 67 (1979), pp. 397–427。
這是一個巨大的優勢,因為它可以使用大量功能而不僅僅是 PRP。CTR模式有IV來隨機化加密,它實現了機率加密。CTR可以實現Ind-CPA安全。
目前,TLS 模式下的所有密碼都在內部使用 CTR 模式,AES-GCM、AES-CCM 和 ChaCha20-Poly1305。
結論
即使您將 IV 添加到您的加密方案中,甚至您解決了密碼問題和最成問題的部分:猜測攻擊,與 CTR 模式相比也沒有任何優勢。
在談論攻擊之前,我建議您使用具有足夠位(至少 128 位)的隨機密鑰而不是密碼。您不需要多次散列密鑰,只需使用一個好的密鑰即可。如果它是從密碼派生的,請使用良好的密鑰派生函式來派生密鑰並改用它。
現在回到你的問題,你自己說過,已知的純文字攻擊是可能的。這樣做非常容易。您只需要知道一個純文字塊,以便通過顯示該塊的雜湊來恢復所有後續純文字。與現代密碼的預期相比,這種安全級別要低得多,現代密碼旨在防止能夠執行選擇的明文或選擇的密文攻擊的對手。根據文件格式,關於文件所有者的可用資訊很少等,可以用來解密整個密文,甚至可以確定或至少縮小到一個明文塊的可行嘗試次數並不難。
實際上,早在我也想到類似的密碼之前,我就想到了將雜湊輸出的左半部分與明文塊進行異或運算,然後對下一個塊的右半部分進行雜湊運算,而不是迭代地散列所有內容。這可以通過將公共隨機數與密鑰混合來隨機化。另一種更廣為人知的方法是在 CTR 模式下使用雜湊來生成流,就像我們使用塊密碼一樣,因為 CTR 模式不需要您能夠解密塊。正如 kelalaka 指出的那樣,它也提供隨機訪問。
但是請記住,這在普通模型中不能被證明是安全的,因此您不能非常確定它與 SHA-2 等散列函式的安全性,而 SHA-2 並非旨在以這種方式使用。這需要進一步假設您的雜湊函式與隨機預言機足夠接近,可以安全地像這樣使用。即使它使用常見的散列函式是安全的,它也可能不會被廣泛使用,因為它會比硬體輔助的 AES 或 Chacha20(也使用上面提到的 CTR 模式)慢得多。