SHA-256 的 HMAC 密鑰的大小應該是多少?
我正在嘗試生成用於 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 中探勘資訊!
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。