HMAC 解决方案中的密钥使用什么(best/good 实践)?

What to use (best/good practice) for the secret key in HMAC solution?

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

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

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

引用 Wikipedia page on HMAC:

The cryptographic strength of the HMAC depends upon the cryptographic strength of the underlying hash function, the size of its hash output, and on the size and quality of the key.

这意味着完全随机的密钥,其中每一位都是随机生成的,比字符集要好得多。

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

使用可见字符作为密钥使密钥更容易被猜到,因为与我们允许所有可能的位组合相比,可见字符的组合要少得多。例如:

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

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


编辑:

正如 martinstoeckli 所建议的,如果必须,您可以使用密钥派生函数从文本密码生成指定长度的字节密钥。这比将纯文本转换为字节并直接使用这些字节作为密钥要安全得多。尽管如此,没有什么比由随机字节组成的密钥更安全了。