哈希和MAC(消息认证码)有什么区别?

80

哈希与消息认证码(MAC)有何区别?

从定义上来看,它们似乎具有相同的功能。

有人能够解释一下它们之间的区别吗?

7个回答

86
主要的区别在于概念上:哈希用于保证数据的完整性,而MAC则保证完整性和身份验证。
这意味着哈希码是从消息中盲目生成的,没有任何外部输入:你得到的是可以用来检查消息在传输过程中是否被篡改的内容。
相比之下,MAC使用私钥作为其生成代码时使用的哈希函数的种子:这应该让接收者确信,不仅消息没有被修改,而且发送消息的人就是我们期望的人:否则攻击者将无法知道用于生成代码的私钥。
根据维基百科,您可以看到:
尽管它们相似,但MAC函数与加密哈希函数具有不同的安全要求。为了被认为是安全的,MAC函数必须抵御在已知明文攻击下的存在性伪造。这意味着即使攻击者可以访问一个拥有秘密密钥并为攻击者选择的消息生成MAC的神谕,攻击者也不能在不进行不可行的计算的情况下猜测其他消息的MAC。
当然,尽管它们相似,它们以不同的方式实现:通常MAC生成算法基于哈希代码生成算法,但具有关注使用私钥的扩展。

6
抱歉,请问“即使攻击者可以访问拥有秘密密钥并为攻击者选择的消息生成MAC的oracle,攻击者也无法猜测其他消息的MAC”是什么意思呢?如果攻击者可以访问具有秘密密钥的oracle,则可以为其他消息生成MAC,并将它们作为输入发送给oracle,不是吗? 即使攻击者可以访问拥有秘密密钥并为攻击者选择的消息生成MAC的oracle,攻击者也无法猜测其他消息的MAC。即使攻击者将自己选择的消息发送到oracle以获取相应的MAC值,但这不会揭示出用于生成MAC的秘密密钥,因此攻击者无法推导出其他消息的MAC值。 - tonix
1
@tonix 这个句子仅用于定义安全的MAC函数。这个假设场景是更现实场景的最坏情况,在该场景中,攻击者可以观察多个明文-MAC对,然后尝试伪造/猜测攻击者想要发送的消息的MAC。 - ZillGate
2
现在其他一些人已经更改了这些定义:哈希函数不提供完整性,而身份验证是我们现在称之为完整性的内容(参见 crypto.stanford.edu/~dabo/cryptobook)。我认为这种变化是最好的。 - David 天宇 Wong
如果在另一种情况或问题下,我们对私钥进行哈希处理,那么与MAC代码相比会有什么不同呢? - LetsGoBrandon
它们似乎很相似,只是MAC基于秘密密钥。 - hanan

23

哈希是一种从消息中产生摘要的函数。一个具有密码学安全性的哈希功能是,对于给定摘要生成一条消息在计算上是不可行的。仅凭一条消息的哈希值无法确定发送者身份。如果您可以安全地传递消息的哈希,则可以用它来验证通过未安全传输接收到的大型消息是否正确。

消息认证码是一种将共享的密钥与消息结合起来的方法,以便消息的接收方可以验证消息发送者拥有共享密钥以及不知道密钥的人不能发送或更改消息。

HMAC是基于哈希的消息认证码。通常,这涉及将哈希函数应用一次或多次到共享密钥和消息的某些组合中。HMAC通常指RFC 2104或FIPS-198中记录的算法。

MAC不会加密消息,因此消息以明文形式存在。它不会泄露密钥,因此可以在开放的通道上传递MAC而不会造成密钥被泄漏的风险。


20

在另一个论坛上找到了这个直截了当的答案。

这些类型的密码原语可以通过它们实现的安全目标(在“附加到消息”的简单协议中)来区分:

完整性: 收件人能否确信消息没有被意外修改?

认证: 收件人能否确信消息来自发件人?

不可抵赖性: 如果收件人将消息和证据传递给第三方,第三方能否确信消息来自发件人?(请注意,我谈论的是密码学意义上的不可抵赖性,而不是法律意义上的不可抵赖性。)此外,这个问题也很重要:

密钥: 原语是否需要共享的秘密密钥或公私钥对?我认为这个问题的简短回答可以用一个表格来解释:

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,接收者必须确信共享的对称密钥仅与发送者共享。 点击此处了解更多信息

1
现在有些人已经更改了这些定义:哈希函数不提供完整性,而认证是我们现在称之为完整性的内容(参见https://crypto.stanford.edu/~dabo/cryptobook/)。我认为这种变化是最好的。 - David 天宇 Wong

5

哈希函数:将任意长度的消息映射为固定长度的哈希值的函数,该哈希值用作鉴别器。

MAC:消息和秘密密钥的函数,生成固定长度的值,用作鉴别器。


你在“哈希函数”的定义中使用“认证器”一词是具有误导性的。SHA(安全哈希算法)本身并不用于认证,而是用于检查数据的完整性。 - Kamran Bigdely

5
哈希是消息的摘要或指纹,本身既不提供完整性也不提供身份验证,因为它容易受到中间人攻击。假设A想向B发送消息M和M的哈希H。但是C截获了消息并生成了消息M2和哈希H2,并将其发送给B。现在B无法确定这是否是来自A的原始消息。然而,哈希可以用其他方式来实现完整性和身份验证,例如MAC。
MAC也是消息的摘要,提供完整性和身份验证。MAC可以通过多种方式计算。最简单的方法是使用具有两个输入的哈希函数:消息和共享密钥。使用共享密钥添加了MAC的身份验证功能,从而提供了完整性和身份验证。但是,MAC仍然无法提供不可否认性,因为任何拥有共享密钥的一方都可以生成消息和MAC。 这时数字签名和公钥密码学就派上用场了。

消息和MAC在通信时是共享的,但是如何共享密钥以重新生成MAC呢?如果密钥通过消息共享,那么中间人不能使用密钥和MAC生成器来获取消息并将其更改后传递给接收者吗? - Abdul Rehman
1
@Bsienn,共享密钥是使用公钥加密生成的,而不是用户直接(通过纯文本消息)共享的。 - Ishtiaq Hussain

3

基本上,主要的区别是MAC使用私钥而哈希不使用任何密钥。因此,由于MAC允许我们实现身份验证。


-9
  1. 哈希函数使用非对称加密,而MAC使用对称加密。
  2. 加密哈希函数并不总是MAC,但MAC可以是加密哈希函数(带密钥的哈希函数)。
  3. 哈希函数提供不可否认性,而MAC则不提供不可否认性。

5
  1. 哈希函数并不一定使用密钥,更不需要使用对称或非对称密钥。
  2. 第三条不完整且前后颠倒。-1.
- user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接