Hmac

SHA-256 的 HMAC 密鑰的大小應該是多少?

  • January 19, 2021

我正在嘗試生成用於 HMAC SHA-256 簽名處理的密鑰。我見過許多長度從 32 個字元到 96 個字元不等的鍵範例。

這個密鑰大小的鐵定規則是什麼?

密鑰的唯一規則是它至少應包含 256 位隨機性。如果密鑰較小,您可能無法獲得 HMAC-SHA-256 的全部安全性。HMAC 的完全安全性與輸出大小基本相同。除非您試圖保護自己免受量子電腦的侵害,否則您應該能夠使用包含 128 位熵的密鑰逃脫。

以下是RFC 2104中擷取的 HMAC 標準的文本:

認證密鑰 K 可以是任意長度,最大為散列函式的塊長度 B。使用長於 B 字節的密鑰的應用程序將首先使用 H 對密鑰進行雜湊處理,然後使用生成的 L 字節字元串作為 HMAC 的實際密鑰。在任何情況下,K 的最小推薦長度是 L 字節(作為散列輸出長度)

因此最好將 256 位密鑰的熵壓縮為 32個字節。您所說的可能是這 32 個字節的十六進製表示。如果密鑰太大,可能會影響 HMAC 函式的性能和效率。無論如何,許多庫只允許使用八位字節插入二進製文件,因此在這種情況下,在使用密鑰之前對其進行十六進制解碼是有意義的。


HMAC 在內部使用散列,它是為任何位串定義的。這個散列既用於鍵也用於值。所以原則上你可以給它任何你想要的東西,直到最大雜湊大小(你永遠無法達到)。

來自維基百科的定義:

$ {\begin{aligned}\operatorname {HMAC} (K,m)&=\operatorname {H} {\Bigl (}{\bigl (}K’\oplus opad{\bigr )}\parallel \operatorname {H} {\bigl (}\left(K’\oplus ipad\right)\parallel m{\bigr )}{\Bigr )}\K’&={\begin{cases}\operatorname {H} \left(K\right)&K{\text{ is larger than block size}}\K&{\text{otherwise}}\end{cases}}\end{aligned}} $

注意關於效率的關鍵重複。

具體答案是 B,如RFC 2104中所定義

認證密鑰 K 可以是任意長度,最大為散列函式的塊長度 B。(對於所有上述雜湊函式範例,B=64 )

很難確定“雜湊函式的塊長度”是什麼意思,所以讓我們在另一個 RFC 中探勘資訊!

來自RFC 4634,第 18 頁

SHA256_Message_Block_Size = 64

然後再往下,在第 69-70 頁:

/*
* USHABlockSize
*
* Description:
*   This function will return the blocksize for the given SHA
*   algorithm.
*
* Parameters:
*   whichSha:
*     which SHA algorithm to query
*
* Returns:
*   block size
*
*/
int USHABlockSize(enum SHAversion whichSha)
{
 switch (whichSha) {
   case SHA1:   return SHA1_Message_Block_Size;
   case SHA224: return SHA224_Message_Block_Size;
   case SHA256: return SHA256_Message_Block_Size;
   case SHA384: return SHA384_Message_Block_Size;
   default:
   case SHA512: return SHA512_Message_Block_Size;
 }
}

選擇任何大於 B 的東西都會被散列到 L,即散列函式 H 的輸出。

B 比 L 提供更多的安全性,所以選擇 B。

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