口令短语,盐和初始化向量,我是否需要它们?

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

53

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

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

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

密码及从密码派生的密钥必须保密。即使攻击者具有密钥派生和加密参数以及密文,没有密钥也无法做任何事情。


更新:

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

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

但是,每个盐位将导致存储派生密钥所需的空间加倍,并且需要更长时间来为其每个可能的密码派生密钥。一些字节的盐,就很快变得不可行,无法创建和存储这样的列表。

盐是防止预计算攻击的必要条件。

初始化向量(或计数器模式中的nonce)使相同的明文产生不同的密文。这可以防止攻击者利用明文中的模式从一组加密消息中收集信息。

初始化向量是隐藏消息模式的必要条件。

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


3
@AkashKava 不,我的说法是正确的。攻击者无法在选择盐之前猜测出一个不可预测的盐。如果盐是保密的,即使在选择之后,攻击者也无法猜测到它。像CMS这样的基于密码的加密协议的标准规定可以将未加密的盐发送与加密消息一起。可预测的盐允许攻击者为常见密码预先计算加密密钥,并多次重复使用该表格以快速解密消息。 - erickson
3
“我正在帮助攻击者通过不猜测盐来缩短时间。” 只有当您的密码非常弱且盐负责推导密钥的熵时,这才是真实的。如果密码本身很强,知道盐也无法帮助攻击者。密码的保密性来自于它的存储方式:在您的大脑或钱包中。您如何保护盐的机密性呢?如果您能保守盐的秘密,那么为什么还需要密码呢?在这种情况下,盐本身可以用作预共享密钥。盐仅用于防止攻击者通过时间空间权衡来预计算密钥。 - erickson
2
@user12861 盐可以防止预先计算的字典攻击。假设攻击者有一个最常用密码列表。为每个密码派生一个密钥需要很长时间(由于KDF的“迭代次数”),但是如果没有盐,他只需要这样做一次并存储结果。然后,他可以非常快速地尝试使用这些派生密钥之一对给定消息进行解密,查找明文的预期特征,以查看是否存在匹配项。使用盐,此攻击的空间要求变得禁止。你读了什么来提出不同的建议? - erickson
2
我们在谈论基于密码的加密。人类不会从2^256空间中均匀地选择密钥,他们使用“password123”。知道这一点,攻击者通常可以通过字典攻击成功地破解设计不良的加密系统,该字典仅占可能密钥的微小部分。如果没有盐,预先计算的字典仍然是可行的。这就是为什么密码加密的标准PKCS #5要求使用盐的原因,以及CMS(S/MIME)为什么同时使用密钥派生盐和密码模式IVs(或nonce)。它们是正交的。 - erickson
4
@user12861,你的问题得到了一些有用的答案,没有浪费。 - Riccardo Galli
显示剩余19条评论

9
首先要说明的是,Rijndael在CBC模式下没有“密码”。在CBC模式下,Rijndael需要一个缓冲区来加密或解密,一个密钥和一个IV。
“盐”通常用于加密密码。将盐添加到加密并存储带有加密值的密码中。这可以防止某人建立所有密码加密方式的字典 - 您需要为所有盐建立所有密码加密方式的字典。旧的Unix密码加密算法实际上可以做到这一点,它只使用了12位盐(它增加了4096个工作因素)。使用128位盐则不可能。
当然,某人仍然可以对特定密码进行暴力攻击,前提是他们能够检索到加密密码。
但是,您有一个IV,它几乎可以执行与Salt相同的操作。您不需要两者。或者说,IV就是您的盐。
顺便说一句,现在我们称“Rijndael”为AES。

2
IV和盐都有类似的作用:它们确保相同的输入产生不可预测的输出。然而,关键派生盐并不能取代IV的需要。通过为每个消息选择一个新的IV,可以使用相同的密码加密多个消息。即使某些消息是相同的,攻击者也无法分辨。 - erickson
看起来OP正在使用基于密码的加密与Rijndael CBC(而Rijndael和AES并不完全相同 - AES实际上是Rijndael的子集;前者具有固定的128位块大小,而后者具有可变块大小)。 - caf
2
盐值用于哈希而非加密。 - Lucas Kauffman
2
在密码哈希中使用盐,有时会使用加密函数而不是哈希函数来完成。 - vy32

2

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

密钥应被视为私有,并且不应与加密数据一起传输,而IV可以与加密数据一起传输。


7
否定。IV并不被视为机密信息,事实上,它需要与加密数据一起存储,否则数据将无法解密。 - vy32
1
天哪,为什么要踩我啊,踩我的人?我已经按照8年前的评论进行了更正。 - Jesse C. Slicer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接