我正在尝试生成用于HMAC SHA-256签名处理的密钥。我看过许多示例,它们的键长度从32个字符到96个字符不等。

此键大小的固定规则是什么?

#1 楼

密钥的唯一规则是它至少应包含256位随机性。如果密钥较小,则可能无法完全获得HMAC的安全性。

最好将其压缩为32个字节。您正在谈论的可能是这32个字节的十六进制表示形式。如果密钥太大,则可能会影响HMAC功能的性能和效率(当然)。许多库只允许使用八位字节(字节)插入二进制。

HMAC在内部使用散列,该散列是为任何位字符串定义的。此哈希既用于键,也用于值。因此,原则上,您可以将所需的任何数据提供给最大散列大小(永远不会达到)。

WikiPedia的定义:


$ { HMAC}(K,m)= H {\ Bigl(}(K \ oplus opad)\; || \; H {\ bigl(}(K \ oplus ipad)\; || \; m {\ bigr}} {\ Bigr)} $


注意重复有关效率的键。

评论


$ \ begingroup $
HMAC被证明对滥用具有相对的抵抗力,但是没有什么能保护加密原语免受密钥太少的密钥的侵害。
$ \ endgroup $
–马腾·博德威斯♦
15年12月23日在10:37

$ \ begingroup $
我想说即使是256位也不是铁定的。如果以128位安全性为目标,则您可能仍不想使用MD5或SHA-1,而应该使用SHA-256。
$ \ endgroup $
–otus
15/12/23在11:12

$ \ begingroup $
@otus如果我没记错的话,256位(或更准确地说,哈希的输出大小)在HMAC标准中。我只是在拼凑那些东西。如果看到较小的密钥大小,我不会惊讶,但是我有点担心推荐它们。
$ \ endgroup $
–马腾·博德威斯♦
15/12/23在11:35



$ \ begingroup $
RFC“强烈建议”密钥短于散列长度的密钥,但允许任何长度。 NIST仅表示密钥必须匹配或超过数据所需的安全级别。同样,即使密钥的长度超过哈希长度也可以提供额外的安全性(因为填充的密钥不同)。
$ \ endgroup $
–otus
15/12/23在11:46

$ \ begingroup $
@archie,我的意思是比哈希输出更长的时间。最初会散列长于块大小的键,但是对于SHA-2,块大小是输出长度的两倍。
$ \ endgroup $
–otus
16年1月20日在8:16

#2 楼

具体答案是B,如RFC 2104中所定义


身份验证密钥K可以是任何长度,最高为B,即哈希函数的block
长度。 (对于上面提到的所有哈希函数示例,B = 64)


很难确定“哈希函数的块长”是什么意思,所以让我们深入研究一下

来自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。