此键大小的固定规则是什么?
#1 楼
密钥的唯一规则是它至少应包含256位随机性。如果密钥较小,则可能无法完全获得HMAC的安全性。最好将其压缩为32个字节。您正在谈论的可能是这32个字节的十六进制表示形式。如果密钥太大,则可能会影响HMAC功能的性能和效率(当然)。许多库只允许使用八位字节(字节)插入二进制。
HMAC在内部使用散列,该散列是为任何位字符串定义的。此哈希既用于键,也用于值。因此,原则上,您可以将所需的任何数据提供给最大散列大小(永远不会达到)。
WikiPedia的定义:
$ { HMAC}(K,m)= H {\ Bigl(}(K \ oplus opad)\; || \; H {\ bigl(}(K \ oplus ipad)\; || \; m {\ bigr}} {\ Bigr)} $
注意重复有关效率的键。
#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。
评论
$ \ 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