我正在根据另一家公司提供给我的规范实施类似HMAC的解决方案。散列参数和密钥的使用不是问题,密钥本身的分布也不是问题,因为我们处于紧密联系和密切的地理位置。
但是 - 实际密钥值的最佳做法是什么?
由于两家公司合作,似乎是这样
使用Rijndael算法生成c9ac56dd392a3206fc80145406517d02
Daisy Daisy give me your answer do
是否同样安全(在此上下文中)作为用于添加到哈希的密钥?
答案 0 :(得分:3)
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从文本密码生成指定长度的字节键。这比将纯文本转换为字节并将这些字节直接用作键更安全。然而,没有比由随机字节组成的密钥更安全的了。