在阅读了许多以前的堆栈交换文章(例如RFC 5869、2104和4868)之后,我对32字节的密钥足以用于HMAC-SHA256感到满意。但是,我正在用C#实现代码,有人指出我Microsoft HMAC-SHA256文档建议使用64字节的密钥:
密钥可以是任何长度。但是,建议的大小为64字节。
是否有充分的理由使用64字节的密钥而不是32字节的密钥?
#1 楼
简短的答案:32字节的全熵密钥就足够了。假设全熵密钥(即密钥的每一位都是通过公平的抛硬币而独立选择的) HMAC-SHA-256防止强行密钥搜索的安全性是由最大64个字节(512位)的密钥大小定义的,然后对于较大的密钥突然下降到32个字节(256位);这是因为在后一种情况下,密钥在使用前会哈希为32个字节。使用64字节的密钥是一个论点:它的大小可以最大程度地抵抗暴力密钥搜索;而且,除了密钥比32字节的密钥难于管理之外,使用64字节的密钥不会损害安全性,并且速度几乎保持不变(没有进行其他哈希处理)。
另一方面, 256位安全性甚至对于包括量子计算机在内的任何可预见的事物都远远不够。如果以每年$ 2 ^ {88} $的速率计算MAC(要求散列工作稍高于专门用于比特币挖掘的哈希值),则可以在已知MAC中以$ 2 ^ {32} $的不同密钥对它们进行检查(可以说,它比散列处理需要更多的工作),并且我们希望$ 32 ^ {-35} $的残差几率是在32年内发现任何密钥,而密钥熵只有160位就足够了,而无需考虑量子计算机。
HMAC-SHA-256专为256位(32字节)加密而设计,没有强烈的论据认为使用具有更大熵的密钥可以提高安全性。除此之外,无法获得最佳安全性证明(Mihir Bellare:NMAC和HMAC的新证明:无碰撞抵抗的安全性,在Crypto 2006 Proceedings中具有扩展的摘要)。
因此,如果密钥是全熵的,那么就没有强大的论据来使用大于32个字节的密钥。
如果不知道该密钥是全熵,则存在一个明显的合理论点,即必须使用大密钥。例如,如果密钥是一个骰子密码,其熵为$ 5 \ log_2(6)\ approx12.9 $ bit / word,则密钥中必须有20个单词,最多139个字符(其中6个字符每个单词的字符数和单词之间的间隔),以达到256位熵。
评论
$ \ begingroup $
谢谢...这很有意义。我计划将PBKDF2与用户提供的密码,256位盐和大量迭代一起使用,以得出256位主密钥。然后,我计划使用HKDF-Expand从主密钥派生256位AES密钥和256位HMAC密钥。似乎可能的攻击媒介将是对密码的字典攻击,因此将HMAC密钥从256位提高到512位不会在实际安全性上提供太多改进。你同意吗?
$ \ endgroup $
–拉尔夫P
16年4月26日在15:33
$ \ begingroup $
@Ralph P:这似乎很合理。最弱的链接很可能是密码的质量与PBKDF2的熵扩展(远不是周围最好的熵扩展功能)相结合的结果,即用户识别他/他可以在哪里安全键入密码的能力。密码,以及用于处理密码的设备的完整性;这些中的任何一个都将比256位弱得多。
$ \ endgroup $
–fgrieu♦
16-4-26在15:59
评论
SHA-256的块大小为64字节。如果您不欠缺CPU能力,则始终可以使用512位哈希(例如SHA512)扩展256位密钥