Symmetric

NIST HMAC 測試向量

  • September 26, 2019

我正在搜尋HMAC-SHA256原語的測試向量以驗證實現的正確性。

我毫不猶豫地在NIST 網站上查看他們提供的內容。

在讀取相應文件(HMAC.rsp來自hmactestvectors.zip)時,我可以看到與SHA256散列函式關聯的給定測試向量是使用不同的密鑰大小計算的: $ 40 $ , $ 45 $ , $ 64 $ 和 $ 70 $ (以字節為單位)。

我對此有點驚訝,因為根據RFC 4868,使用的密鑰應該由 $ 32 $ 字節:

雖然沒有指定固定的密鑰長度

$$ HMAC $$,本規範要求,當用作完整性/身份驗證算法時,必須支持等於散列函式輸出長度的固定密鑰長度,並且不得支持與相關散列函式的輸出長度不同的密鑰長度。

另一方面,我讀到:

然而,超過 128 位的加密密鑰(對於 HMAC 等對稱算法)並不能真正增加安全性,因此實際上不需要使用完整的塊長度密鑰

(請參閱HMAC 密鑰的要求是什麼?

這就是為什麼這些測試向量讓我感到困惑:

  1. 根據上面提到的 RFC,使用的密鑰應該是 $ 256 $ 位密鑰。
  2. 似乎大多數時候,HMAC是用 $ 128 $ 位密鑰。

但是 NIST 測試向量使用比輸出長度更長的鍵(即 $ 256 $ 位,因為使用了 SHA256)。仍然根據RFC 4868

小於輸出長度的密鑰長度會降低安全強度,而大於輸出長度的密鑰不會顯著增加安全強度

那麼為什麼 NIST 使用這些密鑰大小來計算他們的測試向量呢?是不是因為HMAC算法主要是基於散列函式,是這個特性需要特別評估?還有這個文件指定了驗證HMAC實現所涉及的過程,但我沒有看到任何證明選擇密鑰大小的理由。

為了驗證有問題的實現,是否可以找到其他測試向量?我是否可以考慮如果RFC 4868中給出的內容經過驗證,那麼它是否得到了很好的實施?

RFC4868 不是 HMAC RFC,它實際上是RFC 2104。4868 是指在 IPSEC 中使用 HMAC,這就是為什麼存在密鑰長度限制的原因。

可以在 HMAC-SHA256 內部使用的最大長度密鑰等於塊大小,64 字節或 512 位。這在密鑰不是完全熵的情況下很有用,例如由 Diffie-Hellman 密鑰交換生成的共享密鑰;512 位的 ECDH 機密具有大約 256 位的安全性。

如果密鑰長度超過塊長度,則必須首先對其進行雜湊處理以使其適合塊,這就是 70 字節測試值的原因,以確保實現可以正確處理它。NIST 向量中的其他長度是 1 等於塊長度,2 是任意更短的長度。如果一個實現可以處理所有 4 個測試值,通常可以安全地假設它也可以處理一個 32 字節的密鑰。

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