MAC 或身份验证标签(有时也称为签名,尽管我认为这太混乱了)可用于提供消息完整性和消息真实性。消息完整性意味着对手 - 或传输错误 - 在没有被接收者检测到的情况下无法更改消息。对于实物产品,我们称之为防篡改。消息真实性表明消息来自持有密钥的发送者。请注意,双方都有相同的秘密。
实体身份验证有所不同:协议中各方的识别和身份验证通常依赖于非对称加密而不是对称加密。在 TLS 协议中,服务器通常使用私钥/证书对进行身份验证,而消息由使用对称会话密钥生成的身份验证标签保护。
大多数操作模式将允许攻击者对特定位进行更改。例如,在流行的计数器模式(CTR 模式)中,任何位都可以翻转,这将导致明文中相同位置的位翻转。对于 CBC 模式,将更改更多位,但解密和未填充仍然不受影响(除非最后一个密文块发生显着更改)。其他答案之一低估了通过更改密文来局部更改明文的可能性。
通常,MAC 用于密文而不是明文。原因之一是某些操作模式(例如带有 PKCS#7 填充的 CBC)本身就很容易受到攻击。如果填充或明文预言是可能的,CBC 实际上可能允许攻击者检索所有明文,甚至无需攻击密码或获取有关密钥的信息。有关更多信息,请参阅有关 MAC-then-encrypt 和 encrypt-then-MAC 的问题。
MAC 需要在密文和随机数或 IV 上。如果排除了 IV 或 nonce,明文仍可能被对手更改(当然,如果该对手可以访问)。
通常我们会尝试使用经过身份验证的密码或 AEAD 密码。这些密码将自动在验证中包含任何 nonce 或 IV,因此它们应该完全保护明文。
此外,他们可能会使用一个快速的 MAC,当它自己使用时是不安全的,但如果它被密码组合起来是安全的。这些更快的密码的例子是 ChaCha20/Poly1305 和 AES-GCM。例如,两者都包含在 TLS 1.3 中。
甚至还有受 IP 限制的 OCB 模式,它只需要对明文进行一次密码传递即可加密并提供完整性/真实性。Keccak 海绵(用于 SHA-3)也可用于认证模式。
请注意,MAC 本身并不能防止所有攻击。例如,如果在传输协议中使用它,则如果使用相同的密钥,则可能会重播消息。此外,由于 MAC 还依赖于对称密钥,因此可能会捕获从 A 到 B 的消息并将其发送回 A。
由更高级别的协议来防范这种情况。这也是交通安全难的原因之一。对于通用传输协议,仅应用 MAC 是不够的。对于传输安全,请使用 TLS、SSH 或其他已建立的安全传输层。