我的数据库很长。我喜欢加密它。我可以使用xor,但这不是很安全,因为可以看到模式并且可以显示xor值。 IIRC AES具有密钥和初始化向量(IV),可以将其视为种子(当谈论随机数时)。我相信IV应随机制作。当使用密钥加密相同数据时,会发生这种情况。
我如何安全地加密64位?我怀疑它可能不是真正安全的随机IV /种子。但我不想存储它。目前,我能想到的另一个选择是拥有加密RNG并且如果值是第10000个索引则运行它说10000次,然后xor值。但是表现明智,不能扩展。
如何正确安全地加密64位,无需为每个64位存储额外的位?我想也许可以用(种子xor索引)运行加密RNG运行X次,然后用该值运行xor。但我觉得有人有更好的主意吗?
答案 0 :(得分:2)
AES的block size为128位,所以如果你使用它,你最终会加密尽可能多的填充作为有意义的数据。
您可以使用DES(或者,最好是3DES),因为它的块大小为64位。
initialization vector对于攻击者来说应该很难预测,但它实际上并不像密钥一样秘密,所以它可以通过算法选择;例如,请参阅用于生成磁盘加密的每扇区IV的ESSIV算法。您可以使用相同的方案 - 只需用类似记录的唯一ID号替换“扇区号” - 因此您实际上不必存储IV,只需在解密时使用算法重新生成它。 (但是如果您修改了记录的唯一ID,请确保使用新IV进行解密和重新加密!)
如果使用ECB mode进行加密,则可以完全避免使用IV,但这并不是一个好主意。对于给定的密钥,相同的明文总是在ECB模式下加密到相同的密文,因此即使攻击者无法确定实际值,也能够看到两个记录中的密码相同。假设您没有为每条记录使用不同的键,您希望每条记录都有不同的IV。
答案 1 :(得分:1)
如果您有某种索引,可以使用CTR模式加密,索引为NONCE。在这种情况下,您可以安全地使用AES。请注意,有一个重要的警告:如果您再次使用相同的NONCE,那么您会泄漏纯文本(因为您可以检索密钥流)。如果攻击者可以及时查看您的系统,这也可以用于将新值加密到数据库中。