援引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建议,如果你要,你可以使用密钥导出函数来从文本密码指定长度的字节的密钥。这比将纯文本转换为字节并将这些字节直接用作密钥要安全得多。尽管如此,没有比由随机字节组成的密钥更安全的了。
在算法要求的长度内使用随机字节的二进制密钥确实是最好的解决方案。如果有理由使用可读密钥,那么首先使用密钥派生函数从可读密钥中获取二进制密钥。 – martinstoeckli 2015-03-03 21:10:34
Thanks @martinstoeckli我用你的建议更新了我的答案。关键推导函数在这方面肯定值得一提。 – 2015-03-03 21:47:23