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

Blu*_*ppy 4 hash hmac

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

但是 - 实际密钥值的最佳实践是什么?

由于两家公司都在合作,似乎是
c9ac56dd392a3206fc80145406517d02
用 Rijndael 算法生成的,并且与
Daisy Daisy give me your answer do
用于添加到散列的秘密密钥几乎同样安全(在这种情况下)?

Daw*_*tel 5

在 HMAC 上引用维基百科页面

HMAC 的加密强度取决于底层散列函数的加密强度、其散列输出的大小以及密钥的大小和质量

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

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

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

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

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


编辑:

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