代码之家  ›  专栏  ›  技术社区  ›  Chris

初始化向量唯一性

  •  2
  • Chris  · 技术社区  · 16 年前

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

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

    3 回复  |  直到 16 年前
        1
  •  5
  •   Community Mohan Dere    5 年前

    我不久前开始回答,但遭遇了一次崩溃,失去了我输入的内容。我所说的大致是:

    这取决于。。。

    关键的一点是,如果你曾经重用过一个IV,那么你将面临比每次使用不同的IV更容易执行的加密攻击。因此,对于需要再次开始加密的每个序列,都需要一个新的、唯一的IV。

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

    如果要单独加密每条记录,则需要为该记录创建并记录一个IV。如果要单独加密每个字段,则需要为每个字段创建并记录一个IV。存储IVs可能会带来很大的开销,尤其是在进行字段级加密时。

    如果您可以在页面级别而不是行级别(假设行小于一页)进行加密,那么您可以从每页使用一个IV中获益。


    您可以做一些聪明的事情,比如在每个记录中生成一个随机值,然后使用字段名和随机值的散列为该字段生成一个IV。

    但是,我认为更好的方法是在字段中存储一个结构,用于收集算法标识符、该参数的必要参数(如IV)和密文。这可以存储为一个小的二进制数据包,或者编码成一些文本,比如Base-85或Base-64。

    克里斯评论道:

    我想补充一点:

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

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

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

        2
  •  5
  •   Accipitridae    16 年前

    再一次 appendix C of NIST pub 800-38 可能会有帮助。例如,根据这个 只需使用加密密钥加密唯一的nonce,即可为CBC模式生成IV。更简单的是,如果你想使用OFB,那么IV只需要是唯一的。


    让我们先回顾一下为什么静脉注射是必要的。IVs使密文随机化。如果相同的消息使用相同的密钥加密两次(但不同的IVs),则密文是不同的。获得两个(长度相等)密文的攻击者应无法确定这两个密文是加密相同的明文还是加密两个不同的明文。此属性通常称为 ciphertext indistinguishablility . 显然,这是加密数据库的一个重要属性,其中许多短消息都是加密的。

    接下来,让我们看看如果IVs是可预测的,会出现什么问题。让我们举个例子

    这是不安全的。为简单起见,假设用户Alice有一条记录,其中 对于字段F,只有两个可能的值m1或m2。设Ra为用于加密Alice记录的随机值。那么字段F的密文将是

    E (hash(F | | Ra)xor m)。

    随机Ra也存储在记录中,因为否则就不可能解密。想要了解Alice记录值的攻击者Eve可以按如下方式进行操作:首先,她找到一个现有记录,可以在其中添加她选择的值。 让Re为该记录使用的随机值,让F'为Eve可以提交其自身值v的字段。由于记录已经存在,因此可以预测字段F'的IV,即

    Eve可以通过选择她的值v作为

    让数据库加密此值,即

    E K (散列(F | | Ra)xor m1)

    然后将结果与Alice的记录进行比较。如果两个结果匹配,那么她知道m1是存储在Alice记录中的值,否则它将是m2。 this paper ).甚至有一种变体对TLS有效。

    攻击是可以预防的。可能是在使用前对随机数进行加密,然后将其放入记录中,通过加密结果得出IV。但是,也许最简单的方法就是NIST已经提出的建议。为加密的每个字段生成唯一的nonce(这可能只是一个计数器)使用加密密钥加密nonce,并将结果用作IV。

        3
  •  2
  •   erickson    16 年前

    IV唯一性的要求取决于使用密码的“模式”。

    对于CBC,对于给定的消息,IV应该是不可预测的。

    对于CTR,IV必须是唯一的,周期。

    当然,对于ECB,没有IV。如果一个字段是短的、随机的、适合单个块的标识符,您可以安全地使用ECB。

    我认为一个好的方法是在字段中存储一个结构,该结构收集算法标识符、该算法的必要参数(如IV)和密文。这可以存储为一个小的二进制数据包,或者编码成一些文本,比如Base-85或Base-64。