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



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

但是,对于实际密钥,最佳做法是什么?

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

引用HMAC上的维基百科页面:

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

这意味着,完全随机的密钥,每个比特都是随机生成的,比一组字符要好得多。

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

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

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

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


编辑:

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

最新更新