我正在使用PHP的mcrypt
库和AES-256
(rijndael)算法,该算法需要运行密钥+初始化向量。
我的逻辑思维并不是真的与此相关。 不只是一个关键吗?
理论情景:
如果我将加密的敏感数据存储在数据库中,只有所有者应该能够解密,那么将用户散列密码用于密钥或初始化向量到他或她的数据是否合适?
是否应该将密钥视为比初始化向量更私密,还是反过来呢?
答案 0 :(得分:11)
不,实际上IV在大多数实现中都至关重要。 IV也被认为是安全的公共用途,例如IV用于WEP和WPA1 / WPA2的纯文本传输。当使用相同的密钥+ iv加密相同的纯文本时出现问题。除非您使用IV,否则密文将是相同的。如果攻击者可以使用此密钥加密任意纯文本,然后查看密文。这是一种更快的方式,可以强制攻击者获得其他密文。
不仅如此,IV必须是随机的,否则你将违反CWE-329。这是一个问题的原因是更微妙和I didn't get it at first。你没有提到这一点,但我希望你使用的是CBC or CMAC modes
在密码上使用哈希函数几乎与使用String2Key函数相同。只要攻击者无法使用SQL注入获取密钥,这是一个可靠的设计。
答案 1 :(得分:7)
请勿使用散列密码作为密钥和IV的单一来源。根据经验,您应该随机生成随机IV,更新加密数据并使用此数据存储IV。密钥可以多次重复使用,但也可以使用盐水哈希并将盐与数据一起存储。
如果您只是哈希用户密码并将其用作加密密钥,则具有相同密码的用户将具有相同的密钥。根据您的数据库结构和入侵者访问权限,可能会出现一些不幸的情况,即可以检测到具有相同密码的用户。至少为此哈希添加唯一用户名。
如果您不为每次数据更新更改IV,则可能会泄漏有关数据更改的信息。使用CBC或CFB模式,相同的第一个明文块将被加密为相同的密文,直到第一个明文发生变化,因此可以确定此变化的位置。
答案 2 :(得分:6)
初始化向量(IV)根本不是密钥,并不是秘密。实际上,它经常被暴露(例如,预先加密到加密数据)。它被用作加密算法的附加随机输入,因此每次使用不同的IV时,加密相同清晰数据的结果都不同。这样,无法在加密数据上收集统计信息。它本身并没有“改善”加密强度。
您可以查看here以获取显示如何以及为何使用IV的精美图表。
答案 3 :(得分:0)
如果您正在使用分组密码或大多数流密码的EBP模式,则不同明文上的相同密钥+ IV组合将为攻击者提供关键密钥的XOR结果的直接视图。这通过扩展显示密钥本身和某种程度上的密码。
但我的意思是IV绝对是必要的吗?不会。只要你每次在下一个明文块上更改密码(第二次都是同一个块),没有IV就完全没问题。实际上,IV所做的就是上述过程的自动化。