据我所知,HMAC构造具有两个优势:


它可以抵抗长度扩展
由于密钥是在消息之前被消耗的,因此攻击者不知道初始状态,以防止简单的碰撞攻击。

但是简单的结构$ \ mathrm {Hash}(\ mathrm {Hash}(\ mathrm {key}∥\ mathrm {message}))$也会提供这些属性。另一方面,HMAC使用更复杂的结构$ \ mathrm {Hash}(((\ mathrm {key}⊕\ mathrm {opad})∥\ mathrm {Hash}(((mathrm {键}⊕\ mathrm {ipad})∥\ mathrm {message}))$。我以为某些安全性证明需要更复杂的HMAC构造,但我不立即明白为什么。

对于SHA-3候选人,Hash(key || message)被认为是安全的。 ,因为它们可以抵抗长度扩展,而无需两次使用密钥。我相信Skein甚至可以为非常相似的模式提供一些安全证明。

为什么HMAC需要两次注入密钥?

#1 楼

您错过了HMAC最重要的优势:它带有安全性证明(在某些合理的假设下)。外键在证明中起着重要作用。要了解更多信息,最好的地方是阅读HMAC论文:使用散列函数的消息身份验证:HMAC构造,Mihir Bellare,Ran Canetti,Hugo Kawczyk和CryptoBytes Spring1996。
用于消息身份验证的键控哈希函数,Mihir Bellare,Ran Canetti,Hugo Kawczyk和CRYPTO '96。

尤其重要的是,它们证明了对外部函数进行了键控。在您的方案中,外部函数未设置密钥,因此它们的安全性证明将不适用。

正如论文中所解释的那样,内部函数的作用是提供抗碰撞性(压缩一条长消息,直到一个短的指纹,从而使不知道密钥的人无法找到具有相同指纹的消息对,而外部功能的作用是充当此消息的身份验证代码指纹。他们的安全性证明表明,如果内部和外部功能均正确执行其角色,则组合(HMAC)将是安全的消息身份验证代码。因为外部功能必须是安全的消息身份验证代码,所以这意味着需要对外部功能进行加密才能应用其证明方法。

阅读本文。从理论上来说,它们令人惊讶地可读。

评论


$ \ begingroup $
对我来说,奇怪的是HMAC需要此密钥,而用作MAC的SHA-3候选不需要。我相信Skein对于类似于H(k || m)的模式具有安全性证明。 “我们证明,Threefish是可调整的PRP(伪随机排列),那么Skein是PRF。”
$ \ endgroup $
– CodesInChaos
2012年7月30日在6:44



$ \ begingroup $
解释是SHA-3候选人在设计时考虑了“随机预言”。 $ \ hspace {0.75 in} $
$ \ endgroup $
–user991
2012年7月30日在7:50

$ \ begingroup $
这本较新的参考资料针对NMAC和HMAC的新证明:无冲突抵抗的安全性(M. Bellare,Crypto 2006)提出了一个论点,即即使基础哈希中的压缩函数具有不足以进行哈希的属性,HMAC也是安全的耐碰撞。独立地:我喜欢这种直觉的论点,即外部哈希重新编码了前一个的结果。就像在块密码中添加回合一样,这使得恢复密钥或以其他方式区分结果与随机变得更加困难。
$ \ endgroup $
–fgrieu♦
2014年3月18日13:02

#2 楼

作为Skein的合著者,UBI链接模式的属性之一是一次性为您提供类似HMAC的属性。 Skein本身由Threefish可调整块密码,UBI链接模式以及一些证明组成,这些证明将可调整块密码理论扩展为可调整哈希函数理论,从而将哈希函数的安全性降低到块密码的安全性。 (顺便说一句,我将指出,Skein团队的优势之一就是我们所有人都有一定的优势,可以带给整个团队的一部分; Mihir主导了证明,他是HMAC的合著者。) br />
其中一个功能是您可以免费使用Skein获得一次通过的MAC。

HMAC相反,是(通常)所有哈希函数的包装增强其安全性。他们在HMAC上的CryptoBytes的简介文章中说:


“ [从散列函数构造MAC而不是密码的许多困难之一]是因为它们甚至都不是键
原语,即自然不适应秘密
键的概念。”在HMAC之前提出了几种构造,但是它们缺乏令人信服的安全性分析。


HMAC创建了一个围绕任意哈希函数的包装器,并为您提供了一些安全性哈希函数没有。 Skein设计了一个可调整的哈希函数,正是这种调整为您提供了一种安全地放入密钥的机制。

Jon

#3 楼

我要输入另一个答案,因为与DW的答案一样(我投票赞成),它并不能真正回答您的问题。

您说:


但是简单的构造Hash(Hash(key | message))也会提供这些属性。


但是您给出的构造-Hash(Hash(key | message))消息))-具有HMAC没有的缺点。

这些特性之一就是能够抵抗简单的碰撞。什么是“简单的”碰撞是不确定的,您可能不会考虑我要说的是简单的碰撞,但这仍然是一个弱点。

如果我可以构造一个碰撞来这样,冲突就整体传播到了MAC。但是,相同的攻击对HMAC无效。

HMAC使用两个密钥。我将它们称为K1和K2,它们是通过对两个不同的打击垫进行XORing构造而成的。将其视为简单的密钥派生函数。 HMAC不仅因为它使用了内部密钥和外部密钥,而且还因为它们是不同的密钥,所以获得了更大的优势。因此,基于散列冲突构造攻击的攻击者必须与这些密钥中的每一个相撞,这很难。这也是证明的本质(总结)。

因此,对您的确切问题的答案是,这不是关键。它使用两个不同的键,每个键都简单地从基本键派生而来,您被迫将它们都破坏了。

评论


$ \ begingroup $
我认为这是不正确的。使用HMAC,内部函数中的任何冲突都会立即自动成为整个HMAC的冲突(与CodesInChaos要求的构造相同)。因此,您所描述的实际上并不是HMAC的好处。
$ \ endgroup $
– D.W.
2012年8月1日5:37