19

我正在使用 PHP 的mcrypt库和 AES-256(rijndael) 算法,它需要一个键 + 初始化向量才能运行。

我的逻辑大脑并没有真正同意这一点。一把钥匙还不够吗?

理论场景:
如果我对存储在数据库中的敏感数据进行了加密,只有所有者才能解密,那么将用户散列密码用于其数据的密钥或初始化向量是否合适?

是否应该将密钥视为比初始化向量更私密,还是相反?

4

4 回答 4

12

不,事实上 IV 在大多数实现中都是至关重要的。IV 也被认为对公众使用是安全的,例如 IV 以纯文本形式传输用于 WEP 和 WPA1/WPA2。当使用相同的密钥+iv 加密相同的纯文本时,就会出现问题。除非您使用 IV,否则密文将是相同的。如果攻击者可以用这个密钥加密任意明文,然后查看密文。这是暴力破解攻击者获得的其他密文的一种更快的方法。

不仅如此,IV 必须是随机的,否则您将违反CWE-329。这是一个问题的原因有点微妙,我一开始没有明白。您没有提到这一点,但我希望您使用的是CBC 或 CMAC 模式

对密码使用散列函数几乎与使用 String2Key 函数相同。这是一个可靠的设计,只要攻击者不能使用 SQL 注入来获取密钥。

于 2011-02-24T18:39:16.390 回答
7

初始化向量 (IV) 根本不是密钥,也不是秘密。事实上,它经常被暴露(例如添加到加密数据中)。它用作加密算法的附加随机输入,因此每次使用不同的 IV 时,加密相同的明文数据的结果都不同。这样,就无法收集加密数据的统计信息。它本身并不会“提高”加密强度。

您可以在这里查看显示如何以及为什么使用 IV 的漂亮图表。

于 2011-02-24T18:06:33.603 回答
7

不要将散列密码用作密钥和 IV 的单一来源。根据经验,您应该在每次更新加密数据并使用此数据存储 IV 时生成随机 IV。密钥可以重复使用多次,但也可以使用加盐散列并将盐与数据一起存储。

如果您只是散列用户密码并将其用作加密密钥,则具有相同密码的用户将拥有相同的密钥。根据您的数据库结构和入侵者访问权限,可能会检测到具有相同密码的用户。至少向此哈希添加唯一的用户名。

如果您不为每次数据更新更改 IV,则有关数据更改的信息可能会泄露。在 CBC 或 CFB 模式下,相同的第一个明文块将被加密为相同的密文,直到第一个明文发生变化,因此可以确定该变化的位置。

于 2011-02-25T10:09:53.037 回答
0

如果您使用分组密码或大多数流密码的 EBP 模式,不同明文上的相同密钥+IV 组合将使攻击者直接查看密钥的 XOR 结果。这通过扩展揭示了密钥本身,并在某种程度上揭示了密码。

但我的意思是静脉注射绝对是必要的吗?不。只要您每次在下一个明文块(甚至是第二次相同的块)上都更改密码,没有 IV 就完全没问题。事实上,IV 所做的只是上述过程的自动化。

于 2015-03-12T04:51:10.567 回答