初始化向量唯一性

时间:2009-10-28 02:26:38

标签: security encryption

最佳做法是使用独特的静脉输液,但有什么独特之处?每条记录都是独一无二的吗?或绝对独特(每个领域也是唯一的)?

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

3 个答案:

答案 0 :(得分:5)

我刚才开始回答,但遭遇了一场失败,但我失去了我所投入的内容。我所说的是:

这取决于......

关键在于,如果您再次使用IV,那么您可以使用比每次使用不同IV时更容易执行的加密攻击。因此,对于需要再次开始加密的每个序列,您需要一个新的,独特的IV。

您还需要查找cryptographic modes - 维基百科可以很好地说明您不应该使用ECB的原因。点击率模式非常有用。

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

但是,您必须决定是否需要字段级加密的灵活性。您可能 - 这不太可能,但使用单个密钥可能有优势,但不同字段的IV不同。 OTOH,我强烈怀疑它是过度杀伤,更不用说强调你的IV发生器(加密随机数发生器)。

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


Erickson写道:

  

你可以做一些聪明的事情,比如在每条记录中生成一个随机值,并使用字段名称的哈希值和随机值来为该字段生成IV。

     

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

克里斯评论道:

  

我确实在使用CBC模式。我想过一个算法来做1:很多,所以我每条记录只能存储1个IV。但现在我正在考虑将IV与密文一起存储的想法。你能给我更多建议:我使用PHP + MySQL,许多字段是varchar或text。我对数据库中的二进制文件没有多少经验,我认为二进制文件对数据库不友好,所以我总是在存储二进制文件时使用base64_encoded(例如IV)。

我要补充:

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

  • 我认为你应该仔细看看CTR模式 - 正如我之前所说的那样。您可以从48位随机数据​​和一个16位计数器创建一个64位IV。您可以使用计数器部分作为记录的索引(可能是16个字节的块 - 一个用于AES的加密块)。

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

  • 如果您使用单个IV作为记录,但对每个字段使用单独的CBC加密,则每个字段必须填充到16个字节,并且您肯定沉迷于“IV重用”。我认为这在加密方面是不合理的。对于整个记录使用单个IV并且对于记录和CBC模式使用一个填充单位或者没有填充和CTR模式(因为CTR不需要填充 - 其优点之一;另一个仅限于您)会更好使用密码的加密模式来加密和解密数据。)

答案 1 :(得分:5)

再一次,appendix C of NIST pub 800-38可能会有所帮助。例如,根据这一点 您可以通过使用加密密钥加密唯一的随机数来为CBC模式生成IV。如果你使用OFB更简单,那么IV只需要是唯一的。


对于CBC模式下优质IV的实际要求存在一些疑惑。因此,我认为简要介绍一下这些要求背后的原因是有帮助的。

让我们首先回顾一下为什么IV甚至是必要的。 IVs随机化密文。如果相同的消息使用相同的密钥加密两次(但是不同的IV),则密文是不同的。给予两个(同样长的)密文的攻击者不应该能够确定两个密文是否加密相同的明文或两个不同的明文。此属性通常称为ciphertext indistinguishablility。 显然,这是加密数据库的一个重要属性,其中许多短消息都是加密的。

接下来,让我们来看看如果IV可预测会出现什么问题。我们举个例子吧 Ericksons提议:

  

“你可以做一些聪明的事情,比如在每条记录中生成一个随机值,并使用字段名称的哈希值和随机值来为该字段生成IV。”

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

  

E K (哈希(F || Ra)xor m)。

随机Ra也存储在记录中,否则将无法解密。想要了解Alice记录价值的攻击者Eve可以按照以下步骤进行:首先,她找到一个现有记录,在那里她可以添加她选择的值。 设Re为该记录的随机值,让F'为Eve可以提交自己的值v的字段。由于记录已经存在,因此可以预测字段F'的IV,即它是< / p>

  

哈希(F'|| Re)。

夏娃可以通过选择她的价值作为

来利用这一点
  

v = hash(F'|| Re)xor hash(F || Ra)xor m1,

让数据库加密此值,即

  

E K (hash(F || Ra)xor m1)

然后将结果与Alice的记录进行比较。如果两个结果匹配,那么她知道m1是存储在Alice的记录中的值,否则它将是m2。 您可以通过搜索“逐块自适应选择的明文攻击”(例如this paper)来找到此攻击的变体。甚至有一种变体可以对抗TLS。

可以防止攻击。可能通过在将随机数放入记录之前加密随机数,通过加密结果来导出IV。但同样,最简单的事情可能就是NIST已经提出的建议。为您加密的每个字段生成唯一的nonce(这可能只是一个计数器)使用您的加密密钥加密nonce并将结果用作IV。

另请注意,上述攻击是选择的明文攻击。如果攻击者有可能进行选择的密文攻击,即可以修改数据库,则可能发生更具破坏性的攻击。由于我不知道您的数据库是如何受到保护的,因此很难在那里提出任何声明。

答案 2 :(得分:2)

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

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

对于点击率,IV必须是唯一的,期间。

对于欧洲央行,当然没有IV。如果字段很短,适合单个块的随机标识符,则可以安全地使用ECB。

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