39

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

我有什么不对吗?

4

3 回答 3

52

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

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

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

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


更新:

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

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

然而,每一位盐都会使存储派生密钥所需的空间以及为每个可能的密码派生密钥所需的时间增加一倍。几个字节的盐,很快就无法创建和存储这样的列表。

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

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

初始化向量对于隐藏消息中的模式是必要的。

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

于 2009-12-15T05:47:10.783 回答
8

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

“盐”通常用于加密密码。盐被添加到加密并与加密值一起存储的密码中。这可以防止某人构建所有密码如何加密的字典——您需要构建一个所有密码如何为所有盐加密的字典。这实际上可以通过旧的 Unix 密码加密算法实现,该算法仅使用 12 位盐。(它将工作因数增加了 4096)。使用 128 位盐是不可能的。

当然,只要他们可以检索加密的密码,某人仍然可以对特定密码进行暴力攻击。

但是,您有一个 IV,它的作用与 Salt 的作用几乎相同。你不需要两者。或者,更确切地说,IV 是你的盐。

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

于 2009-12-15T04:26:00.967 回答
2

使用散列算法时通常使用。Rijndael 不是哈希,而是双向加密算法。因此,加密数据不一定需要盐。话虽如此,密码的加盐哈希可以用作加密数据的密钥。对于您要查找的内容,您可能希望查看混合密码系统

密钥应该被认为是私有的,并且不会与您的加密数据一起传输,而 IV 可能会与加密数据一起传输。

于 2009-12-15T04:21:41.473 回答