这两种算法有什么区别?
我知道的一个区别是 MAC 是键控的,而哈希不是。
MAC与哈希有什么区别
加密哈希函数是一个完全公开的、确定性的哈希函数,每个人都可以根据任意输入进行计算。它将位序列(任何位序列;一些散列函数正式限制为输入,例如,少于 2 64位,也就是“2 百万兆兆字节”)作为输入,并在相当小的空间中输出值,通常是具有固定大小的位序列(例如,使用标准散列函数SHA-1始终为 160 位)。好的密码散列函数尊重一些条件,这些条件非正式地归结为它们将输入数据混合得如此彻底,以至于我们事后无法弄清楚。
甲消息认证码是一种算法,其作为输入的消息和秘密密钥,并且产生固定大小的输出,其可以稍后上验证为匹配消息; 验证也需要相同的密钥。与一切都知道并且攻击者正在与数学作斗争的哈希函数相反,MAC 在存在具有秘密知识的实体的模型中是有意义的。我们对一个好的 MAC 的期望是不可伪造性:在不完全知道K 的情况下,用给定的密钥K成功验证的消息 + MAC 值对计算应该是不可行的。
因此,散列函数和 MAC 是具有不同属性的不同类型的算法,并且在非常不同的情况下使用。
一些MAC 算法(但肯定不是全部)可以被认为是“带有密钥的哈希函数”,但这是一种限制性的观点。HMAC是一种众所周知的 MAC 结构,它本身以一种智能的方式建立在底层散列函数之上。实际上,散列函数和 MAC 的安全属性和模型彼此完全不同,即使散列函数是安全的,将散列函数和密钥放在一起也不一定会产生安全的 MAC(参见长度扩展攻击,它说明了观点)。
在某种程度上,我们可以说,一个可以在没有IV的情况下安全运行的 MAC 算法必须表现出一些类似哈希的属性(这就是我喜欢 HMAC 的原因:没有 IV,在实现它时很难出错)。然而,魔鬼在细节中。
它们是两个完全不同的原语。MAC 用于消息认证,是一种对称密钥原语。散列函数可以用于多种用途,并且没有特殊的键输入。MAC 是“消息验证码”的缩写。
不要对某些 MAC 算法(例如,SHA1-HMAC)通过使用散列函数作为子程序来工作这一事实感到困惑。他们是非常不同的野兽。
- MAC 算法的一些示例:CMAC、SHA1-HMAC、MD5-HMAC、UMAC、Poly1305-AES。
- 加密哈希函数的一些示例:SHA256、SHA1、MD5。
为了简单起见:通常 MAC 是用密钥加密的哈希值。例如,攻击者可以伪造消息并计算新的哈希值,但如果系统需要使用密钥对哈希值进行加密,他就不能这样做。
从另一个论坛找到了这一点答案。
这些类型的加密原语可以通过它们实现的安全目标来区分(在“附加到消息”的简单协议中):
完整性:收件人能否确信邮件没有被意外修改?
身份验证:收件人可以确信消息来自发件人吗?
不可否认性:如果收件人将消息和证明传递给第三方,第三方是否可以确信消息来自发件人?(请注意,我说的是密码学意义上的不可否认性,而不是法律意义上的不可否认性。)这个问题也很重要:
密钥:原语是否需要共享密钥或公私密钥对?我认为简短的答案最好用一张表格来解释:
Cryptographic primitive | Hash | MAC | Digital
Security Goal | | | signature
------------------------+------+-----------+-------------
Integrity | Yes | Yes | Yes
Authentication | No | Yes | Yes
Non-repudiation | No | No | Yes
------------------------+------+-----------+-------------
Kind of keys | none | symmetric | asymmetric
| | keys | keys
请记住,对所使用的密钥不信任的身份验证是没有用的。对于数字签名,收件人必须确信验证密钥实际上属于发件人。对于 MAC,接收者必须确信共享的对称密钥仅与发送者共享。