security - 初始化向量唯一性

标签 security encryption

最佳实践是使用独特的 ivs,但什么是独特的?每条记录都是唯一的吗?还是绝对独一无二(每个领域也是独一无二的)?

如果是每个字段,这听起来很复杂,如果每条记录中有 60 个字段,您如何管理这么多 iv 的存储。

最佳答案

我刚才开始回答,但遇到了崩溃,丢失了我输入的内容。我所说的是:

这取决于...

关键是,如果您重复使用 IV,您就会面临加密攻击,这种攻击比每次使用不同 IV 时更容易执行。因此,对于需要重新开始加密的每个序列,您都需要一个新的、唯一的 IV。

您还需要查找cryptographic modes - 维基百科很好地说明了为什么不应该使用 ECB。 CTR 模式可能非常有益。

如果您要分别加密每条记录,那么您需要为该记录创建并记录一个 IV。如果您单独加密每个字段,则需要为每个字段创建并记录一个 IV。存储 IV 可能会成为一项巨大的开销,尤其是当您进行字段级加密时。

但是,您必须决定是否需要字段级加密的灵 active 。您可能 - 这不太可能,但使用单个 key 但对不同字段使用不同的 IV 可能会有优势。 OTOH,我强烈怀疑这是矫枉过正,更不用说强调你的 IV 生成器(加密随机数生成器)了。

如果您有能力在页面级别而不是行级别进行加密(假设行小于页面),那么您可能会受益于每页使用一个 IV。


埃里克森写道:

You could do something clever like generating one random value in each record, and using a hash of the field name and the random value to produce an IV for that field.

However, I think a better approach is to store a structure in the field that collects an algorithm identifier, necessary parameters (like IV) for that parameter, and the ciphertext. This could be stored as a little binary packet, or encoded into some text like Base-85 or Base-64.

Chris 评论道:

I am indeed using CBC mode. I thought about an algorithm to do a 1:many so I can store only 1 IV per record. But now I'm considering your idea of storing the IV with the ciphertext. Can you give me more some more advice: I'm using PHP + MySQL, and many of the fields are either varchar or text. I don't have much experience with binary in the database, I thought binary was database-unfriendly so I always base64_encoded when storing binary (like the IV for example).

我要补充的是:

  • IBM DB2 LUW 和 Informix Dynamic Server 的 ENCRYPT_AES() 和相关函数的字符输出都使用 Base-64 编码方案,存储加密方案、IV 和其他信息以及加​​密数据。

  • 我认为您应该仔细研究 CTR 模式 - 正如我之前所说。例如,您可以从 48 位随机数据​​加上一个 16 位计数器创建 64 位 IV。您可以使用计数器部分作为记录的索引(可能在 16 字节 block 中 - 一个用于 AES 的加密 block )。

  • 我不熟悉 MySQL 如何在磁盘级别存储数据。但是,完全有可能加密整个记录,包括 NULL(缺少)值的表示。

  • 如果您对一条记录使用单个 IV,但对每个字段使用单独的 CBC 加密,那么每个字段都必须填充到 16 个字节,您肯定是在沉迷于“IV 重用”。我认为这在密码学上是不可靠的。您最好对整个记录使用单个 IV,对记录和 CBC 模式使用一个填充单元,或者不使用填充和 CTR 模式(因为 CTR 不需要填充 - 它的优点之一;另一个是您只使用密码的加密模式对数据进行加密和解密)。

关于security - 初始化向量唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1634875/

相关文章:

security - 盐和密码 - 前缀或后缀

c++ - 可以从 ByteQueue 中抽取数据的自定义源

java - 从逻辑上解决Java安全错误

java - JDK 1.7 安全随机生成器播种和不可预测性

security - 使用 javax.faces.STATE_SAVING_METHOD 在客户端保存 session 的含义

linux - 为什么 "ulimit -s unlimited"可以在溢出时反ASLR?

c++ - 在 AES 256 Crypto++ 中获取十六进制加密字符串

security - 使用时间作为随机数生成的种子有什么(其他)错误?

java - 如何防止密码重新生成?

php - 任何简单的字符串编码-解码或加密-解密类php?