在最近的一个问题上,显而易见的是,输入数据的HMAC与输入数据的哈希之间存在显着差异。

HMAC和输入数据范围的哈希之间的区别到底是什么?

#1 楼

TL; DR,HMAC是数据的键控哈希。

良好的加密哈希函数提供了一个重要的特性:抗冲突性。查找导致同一摘要的两条消息应该是不切实际的。

HMAC还提供了抗冲突性。但这也提供了不可伪造性。为了生成HMAC,需要一个密钥。如果仅在给定HMAC签名的情况下与受信任方共享此密钥,则您可以确信只有一个受信任方可以生成该签名。

由于哈希函数的共同属性,HMAC不像散列附加到密钥的数据那样简单。这种结构很容易受到长度扩展攻击的攻击,攻击者可以利用该结构获取消息及其HMAC签名,并使用此消息构造具有有效签名的较长消息(从而打破了不可伪造的保证)。

评论


$ \ begingroup $
请注意,“ HMAC”是MAC的特定结构(来自散列函数),您的大多数描述一般都适用于MAC。
$ \ endgroup $
–PaŭloEbermann
13年2月27日在21:13

$ \ begingroup $
如果使用HMAC-SHA3或HMAC-SHA512-384,则长度扩展名不再有效。
$ \ endgroup $
– kelalaka
19/12/14在20:12

#2 楼

简而言之,如果您使用文件的简单哈希来保证文件的完整性,那么攻击者可以修改文件,重新计算修改后的文件的哈希,然后用修改后的哈希替换旧的哈希。对于HMAC,在计算哈希值时会使用密钥,因此,除非攻击者拥有密钥,否则他们将无法计算修改后数据的有效哈希值。

评论


$ \ begingroup $
那么,良好的用户应该如何安全地接收此密钥,以便他们可以计算文件的哈希值?还是仅指对等,私人共享文件?
$ \ endgroup $
– Paul Razvan Berg
18/12/8在17:15



$ \ begingroup $
它是预共享的crypto.stackexchange.com/questions/10371/…
$ \ endgroup $
–scape
19年2月27日在16:29

$ \ begingroup $
HMAC属于对称密码学领域。对称本质上是指两个相应的操作(例如加密和解密或签名和验证)使用同一密钥。就HMAC而言,这意味着可以验证HMAC的人也可以创建一个。诸如公共密钥方案之类的非对称密码提供了解耦这些操作的原语。例如,数字签名方案使用私钥来创建签名,并使用相应的公钥来验证这种签名,而又不具有创建新签名的能力。
$ \ endgroup $
–卢卡斯
20-2-27在22:48



#3 楼

最近的问题涉及散列函数作为密钥派生函数的一部分的正确用法。 HMAC是伪随机函数,从(非正式)意义上讲,如果有人选择了函数F,该函数F是具有秘密密钥的HMAC,或者是从具有相同域和值集的所有函数的集合中随机选择的函数,您无法分辨是哪一个。

哈希函数OTOH正式只需要满足某些条件,例如主原像抗性,次原像抗性和耐碰撞性。这些标准不一定意味着摘要值的下半部分和上半部分是独立的,这在某种意义上是出于手头的目的。