CBC有两个不同的“危险”。请记住,CBC 的工作方式如下:加密一个块,首先将它与前一个加密块进行异或。IV 只是第一个要加密的块的“前一个加密块”。这个想法是分组密码是一种确定性排列:使用相同的密钥和相同的输入块,你会得到相同的输出。与前一个加密块的 XOR 意味着“随机化”。所以危险是:
- 块碰撞。
- 选择明文攻击。
块碰撞是指由于运气不好或缺乏随机性,一个块与前一个块的 XOR 导致一个事先已经获得的值。
例如,如果您使用一个固定的 IV(是否全零,这无关紧要),那么以相同字节序列开头的两条消息将产生两个也以相同字节序列开头的加密流。这允许外人(“攻击者”)看到这两个文件在某种程度上是相同的,这可以通过块粒度来确定。这被认为是一件坏事;加密应该防止此类泄漏。
如果使用计数器作为 IV,您可能仍然会遇到这种冲突,因为计数器具有结构,而“正常”数据也具有结构。作为一种极端情况,假设加密消息也以计数器开头(例如,它是协议的一部分,其中消息具有以序列号开头的标头):IV 的计数器和该计数器可以相互取消使用 XOR,将您带回到固定 IV 的情况。这不好。当加密系统提供机密性而不需要对明文格式提出一些复杂要求时,我们真的更喜欢它。作为“计数器”的高分辨率时钟也可能引发同样的问题。
选择明文攻击是指攻击者可以选择要加密的部分数据。使用 CBC,如果攻击者可以预测IV,那么他可以调整他的明文数据以匹配它。
这是BEAST攻击的基础。在 BEAST 攻击中,攻击者试图“透视”SSL。在 SSL 3.0 和 TLS 1.0 中,每条记录都使用 CBC 加密,每条记录的 IV 是前一条记录的最后一个加密块:攻击者观察线路并在流中输入一些数据的位置可以推送足够的字节触发记录的发射,观察它,从而推断出将用于下一条记录的 IV,其内容将从攻击者推送的下一个字节开始。
在您展示的所有 IV 生成方法中,只有第一个(使用加密强 PRNG生成的 IV )可以保护您免受选择明文攻击。这是添加到TLS 1.1的内容。
在特定情况下,例如数据库中的信用卡,一些可能的攻击可能适用,也可能不适用。但是,不要试图“偷工减料”太多。如果您将用户数据放入数据库,则可能会应用选择明文攻击:可以查看您的数据库(例如,使用某些 SQL 注入技术)的攻击者也可能充当“基本用户”,向您提供虚假的信用卡号码,只是为了查看数据库中显示的内容。
特别是,在这种情况下,如果您使用确定性加密(这正是您使用固定 IV 得到的,无论是否全零),那么攻击者可以简单地暴力破解信用卡号码:一个数字是 16 位,但其中一个是校验和,前四位或六位来自银行,剩下的不一定是“随机的”,所以这类攻击是有效的。
底线是,如果您使用 CBC,那么您必须正确使用 CBC ,即使用强随机 IV。如果您更喜欢单调计数器(或时钟),请不要使用 CBC;相反,使用已知对单调计数器非常满意的模式,例如GCM。当本书使用密码算法时,实现安全性已经够难的了,所以这里的任何“创意”都应该被回避。
当然,使用给定密钥加密的内容并不比密钥本身更机密。当攻击者对您的数据库具有读取权限时,他可能拥有对数据库以外的更多内容的读取权限——特别是对加密密钥本身的读取权限。这取决于您存储密钥的位置,以及攻击者的访问范围(SQL 注入、被盗的备份磁带、前端系统完全劫持……)。