Symmetric

與密鑰派生函式一起使用的人為生成的密碼不會降低對稱加密的安全性嗎?

  • September 23, 2021

AES 的密鑰大小選擇為 256,因為這被認為是可以防止暴力攻擊的最小密鑰大小 - 即 $ 2^{256} $ 嘗試。

然而,在實踐中,對於許多應用程序,使用者選擇的密碼用於使用 KDF 派生 256 大小的密鑰。假設應用程序要求使用 8 個字元的密碼 - 這是一個 64 位密碼 - 所以蠻力減少到 $ 2^{64} $ 嘗試。而且它可能會減少更多,因為來自通用密碼的字節的熵比來自密鑰的字節要小得多。可以按字節而不是按位嘗試蠻力,從而將蠻力降低到甚至小於 $ 2^{64} $ 嘗試。所以這意味著即使是 32 個字元的密碼,AES256 也會比隨機生成的密鑰的 AES256 弱。

那為什麼不用擔心呢?還是我錯過了什麼?

使用慢速 KDF 將減輕由於使用人工選擇的密碼而不是隨機生成 AES-256 而失去的一些安全性 - 但是對此有任何分析嗎?

AES 的密鑰大小選擇為 256,因為這被認為是可以防止暴力攻擊的最小密鑰大小 - 即 $ 2^{256} $ 嘗試。

那是不對的, $ 2^{128} $ 或者 - 更準確地說 - 128 位的密鑰大小 $ 2^{127} $ 平均而言,嘗試被認為是足夠的,當然可以對抗任何實際攻擊。

然而,在實踐中,對於許多應用程序,使用者選擇的密碼用於使用 KDF 派生 256 大小的密鑰。假設應用程序要求使用 8 個字元的密碼 - 這是一個 64 位密碼 - 所以蠻力減少到 $ 2^{64} $ 嘗試。而且它可能會減少更多,因為來自通用密碼的字節的熵比來自密鑰的字節要小得多。

64 位是徒勞的希望,人為生成的密碼平均約為 40 位。當然,即使是精心挑選的 8 個字元的密碼,通常也會使用 ASCII 的子集,它本身就是所有可能字節值的子集。使用通常使用的所有 24 個特殊值,我得到 256 個值中的 86 個值,即 $ log_2(86) \approx 6.43 $ 每個字節的熵位,或 $ \approx 51.41 $ 8 個這樣的字元的位。但這只是在假設完美分佈的情況下,而人類在生成隨機值方面很糟糕。

可以按字節而不是按位嘗試蠻力,從而將蠻力降低到甚至小於 $ 2^{64} $ 嘗試。

通常,您會嘗試針對來自損壞的數據庫或字典攻擊的先前已知密碼。你不會隨意嘗試。如果實現被破壞,其他攻擊是可能的,例如,如果在密鑰派生中沒有使用鹽。

所以這意味著即使是 32 個字元的密碼,AES256 也會比隨機生成的密鑰的 AES256 弱。

是的。餐巾背面會告訴你你失踪了 $ 16 \times 1.5 = 24 $ 至少位。

那為什麼不用擔心呢?還是我錯過了什麼?

這是一個很大的問題,通常你會盡量避免使用密碼。否則,您將使用基於密碼的密鑰派生函式,該函式應用密鑰拉伸,例如 Argon2 變體之一(PBKDF2、scrypt 和 bcrypt 可能更為人所知)。但是這些只為每個密鑰派生提供了很小的保護。一百萬次迭代大約需要 20 位(如 $ log_2(1,000,000) $ 接近20)。它肯定不會把你提升到 $ 2^{128} $ 對於通用密碼; $ 40 + 20 = 60 $ 位,因此破壞加密會很昂貴,但遠非不可行。

在無法避免密碼的情況下,建議您使用密碼管理器,例如使用隨機生成的 12 個字元的密碼(可能需要出現一些符號,以防萬一不走運)。這不會讓你接近 128 位,但對於任何嘗試蠻力或類似技術的人來說,它已經足夠威懾了。當然,也可以使用 32 個隨機十六進製字元並簡單地儲存一個密鑰,假設密碼大小沒有限制。

一個簡單的技巧表明您可以使用$$ l_p = \bigg\lceil {l_k - \log_2(i) \over log_2(N)} \bigg\rceil $$作為了解每個密碼的字元數的方式,假設我們使用上面的值:$$ \bigg\lceil {128 - \log_2(1,000,000) \over \log_2(86)} \bigg\rceil = \bigg\lceil {{128 - 20} \over 6.43} \bigg\rceil = 17 $$假設它是完全隨機的,使用具有 1,000,000 次迭代的 KDF 擴展字元密碼以達到 128 位。

避免這種情況的一種方法是使用公鑰加密,並保持私鑰安全。保護用於解密的私鑰的一個步驟可能是基於密碼的加密,但您可以首先將其保存在記憶棒上,這樣攻擊者就根本無法在不需要它時訪問它。當然,還有許多其他安全密鑰儲存方式。

請注意,當可以採取對策時,這不是一個問題。例如,PIN 通常只有 4-6 位,但您只能嘗試 3 次這一事實可以保護它免受攻擊(PUK 程式碼通常要大得多,因為它們通常不會阻止,因為這可能導致拒絕 -服務攻擊)。然而,例如文件加密離線攻擊通常可以被假設。

引用自:https://crypto.stackexchange.com/questions/95186