为什么除了加密还需要消息认证?

信息安全 加密 密码学
2021-08-11 11:03:08

我一直在阅读Authenticated Encryption with Associated Data链接的 RFC 指出:

认证加密是一种加密形式,除了为加密的明文提供机密性之外,还提供了一种检查其完整性和真实性的方法。

我的理解是,简单地加密数据,即使使用对称共享密钥,使用 AES 或 3DES 之类的东西应该足以验证数据在传输过程中没有被篡改。如果是这样,消息根本不会解密。

那么,为什么需要单独的身份验证?在什么情况下您需要进行单独的身份验证(即使使用带有加密的普通 HMAC)?

4个回答

加密不会自动保护数据不被修改。

例如,假设我们有一个简单的 PRNG(随机数生成器)流密码,其中密钥是种子。加密通过按顺序生成随机数(密钥流)并将它们与明文排除或组合来工作。如果攻击者在特定点知道一些明文和密文字节,他可以将它们异或在一起以恢复这些字节的密钥流。从那里,他可以简单地选择一些新的明文字节并与密钥流异或。

通常攻击者不需要知道明文来实现某些东西。让我们举一个例子,攻击者只需要破坏数据包内部数据中的一个特定字段。他不知道它的价值是什么,但他不需要。只需用随机数替换那些密文字节,他就改变了明文。

这在使用填充的分组密码中特别有趣,因为它为我们打开了填充预言攻击的大门。这些攻击涉及以改变填充字符串的方式调整密文,并观察结果。其他攻击,如BEASTLucky 13 Attack涉及以类似方式修改密文。这些往往依赖于一些实现在执行任何类型的完整性检查之前盲目解密数据的事实。

此外,可能会重新发送加密数据包,这可能会导致客户端或服务器出现某些行为。这方面的一个示例可能是切换防火墙启用状态的命令。这称为重放攻击,加密本身无法防御它。事实上,完整性检查通常也不能解决这个问题。

事实上,安全通信方案需要具备三个主要属性:

  • 机密性 - 防止窃听者发现明文消息或有关明文消息的信息(例如汉明权重)的能力。
  • 完整性- 防止主动攻击者在没有合法用户注意的情况下修改消息的能力。这通常通过消息完整性代码 (MIC) 提供。
  • 真实性- 证明消息是由特定方生成的能力,并防止伪造新消息。这通常通过消息验证码 (MAC) 提供。请注意,真实性自动意味着完整性。

The fact that the MAC and MIC can be provided by a single appropriately chosen HMAC hash scheme (sometimes called a MAIC) in certain circumstances is completely incidental. 完整性和真实性之间的语义差异是真实的,因为您可以在没有真实性的情况下拥有完整性,而这样的系统可能仍然存在问题。

正如 Thomas Pornin 在聊天中向我指出的那样,完整性和真实性之间的真正区别是一个难以定义的区别:

那里有一个棘手的定义点。完整性是你得到“正确的数据”,但根据什么概念“正确”?攻击者的数据怎么不“正确”?如果您回答“因为那是来自攻击者,而不是来自正确的客户端”,那么您正在进行身份验证......

这是一个灰色地带,但无论哪种方式,我们都同意身份验证很重要。

使用单独的 MAC/MIC 的替代方法是使用经过身份验证的分组密码模式,例如Gallois/Counter Mode (GCM)EAX 模式

加密和解密只是转换字节。您说当密码错误时“消息根本不会解密”,但事实并非如此:结果将与原始结果不同。尝试一些像这样的在线加密工具如果你用密码加密“示例” testonetwothree1,你会得到Rg2iS8PvYsIUgmEynHP62g==结果。如果你现在用密码解密相同的密文testonetwothree4,你会得到“JÙ] i.?¦WÆÏ*q”作为结果。

那么这有什么关系呢?如果解密是垃圾,那对攻击者有什么用?

假设您有一条消息说“10:00 攻击”。使用凯撒加密进行加密,类似于aWJiaWtzIGliIDEzOjAw. 您的敌人可能知道您正在发送攻击消息,但不知道密码。但是,他们可以做的是更改一个字节。如果消息更改为aWJiaWtzIGliIDazOjAwE替换为a),它突然说:“在 03:00 攻击”。类似的场景可能是加密命令,攻击者可以使用这些命令以某些方式改变接收计算机的行为。

如您所见,即使是盲目地修改密文,也可能对攻击者有利。您希望在检测到修改的情况下进行经过身份验证的加密。

这不仅适用于 Caesar:某些加密方法允许您更改单个字节(流密码或 CTR 模式下的分组密码)。其他允许您仅更改整个块(大多数其他块密码模式)。这不是加密中的缺陷,而是未验证您的加密的结果。如果你不能检查它应该是什么,你不能责怪加密(它只是提供机密性,而不是完整性),如果结果证明是不同的。如果两者都需要,则需要使用两者兼得的算法。

有两种方法可以做到这一点:

  • 经过身份验证的加密算法一次完成所有工作。你给他们一个密钥和一些数据,然后出来一段密文,当它改变时,就会被检测到。示例包括GCM 模式OCB 模式
  • 添加身份验证代码,例如 HMAC。请注意,您应该按照一定的顺序做事,并且您应该小心计时攻击,因此这比专用算法要复杂一些。我提到它的原因是因为它是传统的做事方式,而你最喜欢的加密库中可能没有更新的算法。

我的理解是,简单地加密数据,即使使用对称共享密钥,使用 AES 或 3DES 之类的东西应该足以验证数据在传输过程中没有被篡改。如果是这样,消息根本不会解密。

你的理解是错误的。

如果有人翻转了一下,为什么消息不会解密?

甚至这个维基百科页面也清楚地表明:

分组密码模式 ECB、CBC、OFB、CFB、CTR 和 XTS 提供机密性,但它们不能防止意外修改或恶意篡改。

我正在链接到该页面,因为答案确实取决于操作模式,并且有些(如 GCM)确实具有内置 MAC。

更具体地说,除非有校验和或签名,否则加密算法基本上是将字节转换为其他字节。就像凯撒密码会变成 A => K 和 B => L,现代加密基本上做同样的事情,只是更复杂。如果有人将密文中的 K 更改为 L,那么解密将愉快地将其解密为 B 而不是原来的 A。

这种恶意攻击通常是不可行的,因为在不了解明文和密钥的情况下,Eve 很难知道要翻转哪些位以便在解密消息中获得可预测的变化,但是没有 MAC,没有什么能阻止她从随机翻转位并希望获得最好的结果。

加密确保数据不能被读取或篡改。身份验证可确保您知道数据的来源。

更实用的观点:我的银行在我的网络浏览器和它的网络服务器之间使用加密链接 (https),​​但如果没有身份验证,它不会让我看到我的银行账户中没有的内容。