2011-02-24 41 views
18

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

我的逻辑思维并不真正与此相伴。 是不是一个足够的关键?

理论情景:
如果我加密存储在数据库中,只有车主应能够解密敏感数据,这将是适合使用的用户哈希密码要么键或初始化矢量到他或她的数据?

应该重点考虑比初始化向量更多的私人或者是周围的其他方式?

+2

+1好问题。 – rook

回答

11

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

不仅如此,该IV必须是随机的,或者你就违反了CWE-329。这是一个问题的原因有点微妙和I didn't get it at first。您没有提到这一点,但我希望您使用的是密码上使用散列函数几乎与使用String2Key函数相同。只要攻击者无法使用SQL注入来获取密钥,这是一个可靠的设计。

+0

Hi Rook。这对我来说都是新闻。非常感谢!如果我用非随机IV的'CFC',我应该是安全的? – Industrial

+0

@工业实际上它的'CBC'模式和IV **必须是随机的。在数据库中,您可以为iv创建一个列,并使用'mt_rand()'生成此编号。 – rook

+0

@ R嗯。我无法解密我的加密的字符串,而没有在加密和解密之间保持一致的IV,所以没有真正的随机存在。也许我做错了什么,或者你是说IV总是应该完全随机化的? – Industrial

6

初始化向量(IV)是不是一个关键的一切,已经不是秘密了。事实上,它经常被暴露(例如被加密数据前置)。它用作加密算法的附加随机输入,因此每次使用不同的IV时,加密相同清除数据的结果都不相同。这样,无法在加密数据上收集统计信息。它本身不会“改善”加密强度。

你可以看看here的漂亮表示如何以及为什么IV使用。

+0

太好了。谢谢! – Industrial

7

不要将散列密码用作密钥和IV的单一来源。作为一个经验法则,您应该随机生成IV EVERY TIME,更新加密数据并将IV存储到该数据中。密钥可以多次重复使用,但是也可以使用腌制哈希和数据存储盐。

如果你只是哈希的用户密码,并用它作为加密密钥,用户使用相同的密码,将有相同的密钥。根据您的数据库结构和入侵者访问权限,当可以检测到具有相同密码的用户时,可能会出现一些不幸的情况。至少为此散列添加唯一的用户名。

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

+0

非常重要的建议 – davka

+0

非常感谢你的建议! – Industrial

+0

因此,而不是DB中的一个字段,现在至少需要3个字段?加密值,IV和盐?我们甚至可以将密钥添加到数据库中,使其在数据库中有4个字段(但我不会将密钥保存到数据库)。听起来像很多工作,可能是不必要的? – Piero

0

如果您使用的块加密的EBP模式,或大部分流密码中,相同的键+ IV上不同明文的组合将提供攻击者对密钥的XOR结果的直接视图。这个扩展揭示了密钥本身以及在某种程度上的密码。

但是,我的意思是说IV是绝对必要的吗?不,只要你在你的下一个纯文本块中每次更改你的密码(即使是第二次同一个块),你也完全没有IV。实际上,IV所做的就是上述过程的自动化。

+0

什么是EBP模式?从来没有听说过这个,快速搜索也没有发现任何东西。 OFB和CTR模式泄漏密钥流,因为它们实际上是流密码。但没有流行模式泄漏密钥本身。 – CodesInChaos