在HMAC解决方案中使用什么(最佳/良好实践)密钥?

时间:2015-02-23 05:09:09

标签: hash hmac

我正在根据另一家公司提供给我的规范实施类似HMAC的解决方案。散列参数和密钥的使用不是问题,密钥本身的分布也不是问题,因为我们处于紧密联系和密切的地理位置。

但是 - 实际密钥的最佳做法是什么?

由于两家公司合作,似乎是这样 使用Rijndael算法生成c9ac56dd392a3206fc80145406517d02
Daisy Daisy give me your answer do
是否同样安全(在此上下文中)作为用于添加到哈希的密钥?

1 个答案:

答案 0 :(得分:3)

引用Wikipedia page on HMAC

  

HMAC的加密强度取决于底层哈希函数的加密强度,哈希输出的大小,以及密钥的大小和质量

这意味着完全随机的密钥,其中每个位是随机生成的,远比字符集好。

密钥的最佳大小等于块大小。如果密钥太短,则通常用零填充(这不是随机的)。如果密钥太长,则使用其散列函数。散列输出的长度无论如何都是块大小。

使用可见字符作为键使得键更容易猜测,因为与我们允许每个可能的位组合相比,可见字符的组合要少得多。例如:

ASCII中有95个可见字符(256种组合中)。如果块大小是16字节(HMAC_MD5)则存在95 ^ 16~ = 4.4 * 10 ^ 31的组合。但是对于16个字节,有3.4 * 10 ^ 38种可能性。攻击者知道密钥只包含可见的ASCII字符,他知道他需要的时间比他必须考虑每个可能的位组合要少大约10 000 000倍。

总结我建议使用加密伪随机数生成器生成密钥,而不是使用自己的密钥。


编辑:

正如martinstoeckli建议的那样,如果必须,可以使用key-derivation-function从文本密码生成指定长度的字节键。这比将纯文本转换为字节并将这些字节直接用作键更安全。然而,没有比由随机字节组成的密钥更安全的了。