Keys

密鑰和混合編碼 - 安全隱患

  • August 18, 2017

假設我們生成一個 256 位密鑰,例如:secret = base64(csprng(32)). 假設有人使用秘密 ascii 解碼 base64 編碼的字元串並將輸出用作密鑰(即ascii_decode(secret))。

請注意,在此特定場景中,密鑰用於 HMAC-SHA256 函式。

這樣做有什麼安全隱患?有什麼可能的問題嗎?

你只有 $ 6 $ 熵位 $ 8 $ 您的輸出的位 - 通常不滿足在整個範圍內均勻隨機繪製的加密密鑰的要求。一般來說,這可能是災難性的:您沒有安全保證,因為不再有安全證明適用。在最壞的情況下,這種密鑰偏差會完全破壞系統 - 沒有人注意到。

但是,在一般情況下,您還應該注意到那些 $ 256 $ CSPRNG的位輸出不 $ 256 $ 如果您將其編碼為 Base64 並解碼為 ASCII,請再多一點。它應該是 $ 344 $ 位輸出,並且不再適合,如果 $ 256 $ 位鍵是預期的。

在您使用 HMAC 的特定情況下,它可能沒問題 - 因為 HMAC 能夠處理不同的密鑰長度:HMAC 所做的第一件事是將密鑰轉換為正確的長度。如果密鑰太短,則對其進行填充,如果密鑰太長,則在密鑰上使用散列函式。你有 $ 256 $ btis 在更長的字元串中的熵,所以這應該沒問題。


但請注意:配備加密函式來處理可變密鑰長度是不尋常的,這是一個幸運的收穫。雖然它應該在這種情況下工作,但通常忽略關於 key 的假設是一個非常糟糕的主意。術語密鑰通常意味著它是從特定範圍統一繪製並以二進制格式考慮的。

不,我認為這種方法沒有任何安全問題。

  1. 截斷的 32 個字元的 base64 編碼密鑰仍包含 192 位熵。192 > 128 和 128 位算法表面上被認為是安全的。如果不是為了戰略防禦,對 Joe Public 來說當然足夠安全。
  2. Base64 編碼僅使用每個可用 8 位中的 6 位,但這是在整個密鑰長度上以逐字節為基礎的。這清楚地為密鑰引入了 2 位偏差。然而,強密碼函式被認為是隨機函式。事實上,它們被用於真正隨機數生成器中的隨機性提取,而這些生成器往往具有(相對)巨大的偏差。與 25% 相比,您很容易有 33% 的偏見。由於雪崩效應,輸出無論如何都會變得均勻隨機。有弱密鑰的概念,但很難想像仍然包含 192 位熵的弱密鑰。

因此,除非 HMAC-SHA256 非常容易受到偏向密鑰的影響,否則 192 位熵加上雪崩效應將確保您的數據安全。偏差只是被 192 位隨機性所包含並消失。

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