Hash

是否應該將 HMAC 或 NMAC 或普通 Keccak 用於安全 MAC?

  • August 5, 2014

HMAC 規範中進行了一些探勘之後,我發現了這個(意譯):

第 1 步:如果 Key 的長度等於散列函式的塊大小(SHA-256 為 512 位/64 字節),則將密鑰設置為等於密鑰。直接進入第 4 步。

Step 2:如果key的長度大於hash函式的block size,則對key進行hash,得到一個與hash函式輸出長度相同的字元串,然後在Block Size的長度上追加0。

步驟 3:如果 key 的長度小於雜湊函式的塊大小,則在 key 的末尾附加 0,使 key 長度現在與塊長度相同。

因此,如果您輸入 512 位密鑰:

ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a
2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f

然後就不會動了。但是,如果您在末尾添加至少一個字節,例如“aa”,則密鑰現在變為:

3f78f631195be2c7675973fb6c542a7b9b6cda1e6ba59bd1093ebacf70408f53
0000000000000000000000000000000000000000000000000000000000000000

或者,如果您的塊大小小於塊大小,則可能是 256 位密鑰:

ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a

然後它現在變成:

ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a
0000000000000000000000000000000000000000000000000000000000000000

似乎使用 HMAC 更安全的方法是輸入一個與所使用密碼的塊長度完全相等的密鑰,對於 SHA-256 來說,它是 512 位。這必須將密鑰的完整 512 位擴散到 HMAC。否則 HMAC 會將至少一半的密鑰歸零。

我做了更多的閱讀,發現有一個類似於 HMAC 的 NMAC 規範,但需要兩個獨立的隨機密鑰:

NMAC = H( k1 || H( k2 || m ))。

問題:

  • 在 HMAC 中將至少一半的密鑰作為空字節對安全性有什麼影響(在大多數情況下都會發生這種情況,除非特別注意選擇與塊大小長度相同的密鑰大小)?
  • 一般來說,HMAC 和 NMAC 哪個更安全?鑑於 HMAC 的規範似乎沒有使用兩個獨立的隨機密鑰,而是從主密鑰派生出內、外密鑰,並且在前 3 步中也弱化了主密鑰。
  • 如果我有一個比散列函式的塊長度更長的密鑰,使用 NMAC 結構而不是 HMAC 會更強嗎?也許通過將完整的隨機密鑰分成兩半來用作k1k2。例如,我有一個隨機的 768 位密鑰,我將其拆分為兩個 384 位密鑰,然後將其與 NMAC 一起使用。在 HMAC 下,768 位密鑰將減少到 256 位偽隨機與 000000000000000000000 的 256 位連接…在這種情況下,我認為 NMAC 會更安全,對嗎?
  • 我知道 HMAC 是專門為 Merkle–Damgård 類型的雜湊設計的,但是 Keccak(海綿結構)可以與 HMAC 一起使用嗎?還是將它與 NMAC 一起使用更好?或者只是按照 Keccac 作者的意圖做 H( k || *m )?*長度擴展攻擊不再是 Keccak 的問題。

HMAC 和 NMAC 對底層散列函式做出假設 $ H $ 為他們的安全證明。此外,它們旨在消除使用 MD 類型雜湊的其他 MAC 構造中的已知缺陷。

NMAC 不是 $ H(k1 $ $ || $ $ H(k2 $ $ || $ $ m)) $ ,它實際上使用密鑰作為初始雜湊值,這需要對雜湊內部進行更高級別的訪問,這意味著大量的實現不能像使用 HMAC 一樣使用 NMAC。

回答你的問題。。

  • 對於 HMAC,當密鑰長度小於塊長度時,由於填充空字節,不會對安全性產生可利用的影響。最大安全性將是輸出長度 $ H $ 或輸入長度 $ k $ ,以較短者為準。
  • NMAC 被認為是更強的 MAC,但由於需要修改初始雜湊值,因此在實踐中使用較少。對 NMAC 的攻擊適用於 HMAC,但並非總是相反。我會擔心 IV 的選擇可能會削弱 $ H $ 就其作為 PRF 而言,這可能會使安全聲明無效,但在這種情況下,對偽造的抵抗力很可能不會受到損害;僅當壓縮功能較弱時才會出現這種情況,並且在這種情況下,雜湊還有其他安全問題。
  • 再一次,由於 NMAC 修改了 IV,你不能有大於輸出長度的密鑰 $ H $ 用於 MD 類型的雜湊函式。在 HMAC 中,大於塊大小的密鑰被散列到輸出大小,因此密鑰的最大有效大小更小。
  • Keccak 可以與 HMAC 一起使用,但不能與 NMAC 一起使用,因為海綿構造安全聲明要求狀態為 0,而 NMAC 要求狀態為密鑰。鍵控海綿功能 $ H(k $ $ || $ $ m) $ 對於給定的密鑰長度,它可能比 HMAC 更安全,因為內部狀態大於輸出長度。

塊大小的 HMAC 填充本質上允許對消息空間的該部分進行單次迭代以更改 IV,使其更接近 NMAC,因為壓縮函式的下一個輸入是消息。對於 HMAC,如果密鑰長度等於塊長度,您將獲得最大安全性,假設安全性高於輸出長度 $ H $ 可以實現。填充常量在那裡,因此內部和外部雜湊函式的 IV 都是唯一的,但仍然與 $ k $ .

鍵控海綿函式從容量中獲得安全性,有界 $ min(2^{c-1}/M $ $ , $ $ 2^k) $ , 在哪裡 $ c $ 是容量,除非 $ M $ 超過 $ 2^{c/2} $ . 這意味著具有足夠大容量的大型消息的安全性更高,因為 HMAC 的安全性隨著每個後續輸入塊開始下降(如果我在那個輸入塊上錯了,請糾正我),並且上限為 $ 2^{c/2} $ ,其中 c 是摘要大小。這意味著密鑰海綿函式可以具有比 HMAC 的安全證明所需的更小的容量,從而在適當的選擇下使其更有效或更安全 $ c $ .

正如 fgrieu 所指出的,HMAC 和 NMAC 並非來自 NSA 或 NIST,而是來自大學研究。NIST 認可它的事實並不意味著存在弱點。內部雜湊鏈大小是我們這裡的限制安全因素,以及建構 HMAC 以不受限制地使用雜湊函式。

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