如果我用随机生成的 Key 和 Initialization Vector 对一些数据进行加密,则将所有三条信息存储在同一个表行中;是否有必要加密 IV 以及密钥?
简化表结构:
- 加密数据
- 密钥(使用第二种方法加密)
- IV(加密?)
请假设架构和方法是必要的:背后的解释冗长而乏味。
如果我用随机生成的 Key 和 Initialization Vector 对一些数据进行加密,则将所有三条信息存储在同一个表行中;是否有必要加密 IV 以及密钥?
简化表结构:
请假设架构和方法是必要的:背后的解释冗长而乏味。
来自维基百科:
初始化向量与密钥具有不同的安全要求,因此IV 通常不需要保密。然而,在大多数情况下,重要的是初始化向量永远不会在相同的 key 下重用。对于 CBC 和 CFB,重用 IV 会泄露一些关于第一个明文块以及两条消息共享的任何公共前缀的信息。
您不需要对 IV 保密,但它必须是随机且唯一的。
如果我用随机生成的 Key 和 Initialization Vector 对一些数据进行加密,则将所有三条信息存储在同一个表行中;是否有必要加密 IV 以及密钥?
不,可能只需要加密存储密钥;没有必要对随机 IV 进行加密。
显然(秘密)密钥需要保密。如果您使用加密(即将负担转移到另一个密钥或密钥对)或任何其他方法来做到这一点,则取决于架构师。但是,如果您要将其存储在数据库旁边,那么一个好的密钥包装方法(例如 AES-WRAP、AES-SIV)是保护您的静态密钥的一部分的合乎逻辑的选择。使用密钥时,需要具备其他安全机制,例如访问控制/防止侧信道攻击。
对于 CBC 模式,IV 需要对对手来说是不可预测的。如果不是这种情况,那么 CBC 在使用密文 oracle 的主动攻击下失败。一般来说,您应该假设存在这样的预言机。例如,您应该假设攻击者可以将任何消息发送到您的数据库,然后您将其加密并存储在数据库中以供攻击者读取。由种子良好的加密安全(伪)随机数生成器 (CSPRNG)(例如 /dev/urandom)生成随机 IV可以避免此类问题。
加密 IV 是一种危险的做法,因为 IV 会与明文进行异或运算。如果这样做,则应使用不同的密钥对其进行加密,否则还可能损害 CBC 模式的安全性。如果您必须使用当前密钥,那么您应该使用生成的密文作为 IV 而不是明文输入。但是,对于完全没有必要的随机 IV:您可以将其存储在密文旁边而无需保护。
补充:消息完整性和真实性
一般来说,在使用之前至少验证存储消息的完整性和真实性总是一个好主意。应该首选使用诸如 GCM 或 EAX 之类的操作模式。
请注意,GCM 和 EAX 都不需要不可预测的 IV;IV 只需要是唯一的 - 除了大小之外没有其他要求;使用 128 位的完全随机 IV/nonce 当然也可以。它们会自动将 IV 包含在身份验证标签的计算中。
在密文上使用 HMAC (也称为 encrypt-then-MAC)已被证明非常成功地提供了完整性/真实性,但请注意,如果您决定使用 HMAC,则应在计算中包含IV*。