初始化向量唯一性

Chr*_*ris 2 security encryption

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

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

Jon*_*ler 5

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

这取决于...

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

您还需要查找加密模式 - 维基百科可以很好地说明您不应该使用ECB的原因.CTR模式非常有用.

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

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

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


埃里克森写道:

您可以做一些聪明的事情,比如在每个记录中生成一个随机值,并使用字段名称和随机值的哈希值为该字段生成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不需要填充 - 其优点之一;另一个是您只有使用密码的加密模式来加密和解密数据).

  • 也感谢尽管崩溃重新输入答案,我很感激:) (2认同)

Acc*_*dae 5

再次,NIST酒馆800-38的附录C中可能会有所帮助.例如,根据此,您可以通过使用加密密钥加密唯一的随机数,为CBC模式生成IV.如果你使用OFB更简单,那么IV只需要是唯一的.


关于CBC模式中的良好IV的真正要求存在一些混淆.因此,我认为简要介绍一下这些要求背后的原因是有帮助的.

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

接下来,让我们来看看如果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,即它是

哈希(F'|| Re).

夏娃可以通过选择她的价值v来利用这一点

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

让数据库加密这个值,即

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

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

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

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