密码,盐和IV,我需要所有这些吗?

时间:2009-12-15 04:13:04

标签: encryption aes rijndaelmanaged

如果我使用Rijndael CBC模式,我不知道为什么我们需要盐。 我的理解是,即使人们知道密码,但如果没有IV,他也无法获得数据。 所以从我的角度来看,密码+ IV似乎足够安全。

我有什么不对吗?

3 个答案:

答案 0 :(得分:45)

是的,你需要所有这些东西。

Salt(和“迭代计数”)用于从密码中派生密钥。有关更多信息,请参阅PKCS#5。用于密钥派生的salt和迭代计数不必是秘密的。然而,盐应该是不可预测的,最好随机选择。

CBC模式需要初始化矢量。这是由加密随机数生成器为每个消息生成的随机数据块。它用作密文的虚拟初始块。与密钥派生盐一样,它不必保密,通常与密文一起传输。

密码和从中派生的密钥必须保密。即使攻击者拥有密钥派生和加密的参数以及密文,如果没有密钥,他也无能为力。


更新

密码不是随机选择的;有些密码比其他密码更有可能。因此,攻击者不是生成给定长度的所有可能密码(穷举暴力搜索),而是维护密码列表,按降低概率排序。

从密码派生加密密钥相对较慢(由于密钥派生算法的迭代)。为几百万个密码导出密钥可能需要数月时间。这将激励攻击者从他最可能的密码列表中获取密钥一次,并存储结果。通过这样的列表,他可以快速尝试使用列表中的每个密钥进行解密,而不是花费数月的计算时间来再次获得密钥。

但是,每一点盐都会使存储派生密钥所需的空间加倍,并为每个可能的密码派生密钥所需的时间。几个字节的盐,很快就变得不可能创建和存储这样的列表。

盐是防止预计算攻击所必需的。

IV(或具有计数器模式的随机数)使相同的纯文本产生不同的密文。防止攻击者利用纯文本中的模式从一组加密消息中获取信息。

需要初始化向量来隐藏消息中的模式。

一个用于增强密钥的安全性,另一个用于增强使用该密钥加密的每个消息的安全性。两者都是必要的。

答案 1 :(得分:6)

首先要做的事情是:Rijndael在CBC模式下没有“密码”。 CBC模式下的Rijndael需要一个缓冲区来加密或解密,一个密钥和一个IV。

“salt”通常用于加密密码。盐被添加到密码中,该密码被加密并与加密值一起存储。这可以防止有人建立所有密码加密的字典 - 你需要建立一个字典,说明所有密码如何为所有盐加密。使用旧的Unix密码加密算法实际上是可能的,该算法仅使用12位盐。 (它将工作因素提高了4096)。使用128位盐是不可能的。

当然,有人可以对特定密码进行暴力攻击,前提是他们可以检索加密密码。

然而,你有一个IV,它与Salt的功能完全相同。你不需要两者。或者说,IV是你的盐。

顺便说一下,这些天我们称之为“Rijndael”AES。

答案 2 :(得分:1)

使用salt时通常会使用hash algorithm。 Rijndael不是哈希,而是双向encryption algorithm。因此,加密数据不一定需要盐。话虽如此,密码的盐渍哈希可以用作加密数据的密钥。对于您正在寻找的内容,您可能希望查看hybrid cryptosystems

密钥应被视为私密密钥,不会与您的加密数据一起传输,而IV可能会与加密数据一起传输。