加密不会自动保护数据不被修改。
例如,假设我们有一个简单的 PRNG(随机数生成器)流密码,其中密钥是种子。加密通过按顺序生成随机数(密钥流)并将它们与明文排除或组合来工作。如果攻击者在特定点知道一些明文和密文字节,他可以将它们异或在一起以恢复这些字节的密钥流。从那里,他可以简单地选择一些新的明文字节并与密钥流异或。
通常攻击者不需要知道明文来实现某些东西。让我们举一个例子,攻击者只需要破坏数据包内部数据中的一个特定字段。他不知道它的价值是什么,但他不需要。只需用随机数替换那些密文字节,他就改变了明文。
这在使用填充的分组密码中特别有趣,因为它为我们打开了填充预言攻击的大门。这些攻击涉及以改变填充字符串的方式调整密文,并观察结果。其他攻击,如BEAST和Lucky 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 模式。