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

Kel*_*vin 37 encryption aes rijndaelmanaged

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

我有什么不对吗?

eri*_*son 48

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

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

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

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


更新:

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

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

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

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

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

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

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

  • @ user12861你的问题给我们一些有用的答案,没有浪费 (4认同)
  • 同样值得一提的是,如果你拥有除IV以外的所有东西,你可以成功解密除第一块明文之外的所有内容. (2认同)
  • @AkashKava不,我的陈述是正确的.在选择之前,攻击者无法猜测*不可预测的*盐*.如果盐是*秘密的,*攻击者即使在选择之后也无法猜测它.基于密码的加密协议的标准,如[CMS](http://tools.ietf.org/html/rfc3211#section-2.1),指定[未加密的盐可以发送](http://tools.ietf.org /html/rfc2898#appendix-A.2)以及加密的消息.可预测的盐允许攻击者预先计算公共密码的加密密钥,并多次重用该表以快速解密消息. (2认同)
  • @AkashKava"我正在帮助攻击者通过不猜盐来减少时间." 只有当您的密码非常弱并且salt负责派生密钥中的熵时,才会出现这种情况.如果密码本身很强,那么了解盐对攻击者无济于事.密码的保密性来自其存储:在您的大脑或钱包中.你怎么保密盐?如果你可以保密,你为什么需要密码?在这种情况下,盐本身可以用作预共享密钥.Salt仅**以防止攻击者在时空权衡中预先计算密钥. (2认同)
  • @ user12861 salt可以防止预先计算的字典攻击.假设攻击者拥有最常选择的密码列表.为每个人获取一个密钥需要很长时间(因为KDF的"迭代次数"),但是如果没有盐,他只需要做一次并存储结果.然后,他可以非常快速地尝试用这些派生密钥中的每一个解密给定消息,寻找纯文本的预期特征以查看他是否匹配.使用盐,这种攻击的空间要求变得令人望而却步.你还在读什么呢? (2认同)
  • @ user12861初始化向量提供密文不可区分性; 即使您可以多次使用相同的密钥加密相同的纯文本,每次生成的密文也会不同,攻击者也不会更聪明.我的理由:IV如何提供针对预先计算的字典攻击的任何保护?链接的帖子没有说使用一个消除了对另一个的需要.相反,他们指出盐和Ⅳ完全不同且无关.如果一个人取消了另一个,他们就不会无关. (2认同)
  • 我们在这里谈论*基于密码的加密*。人类不会以统一的概率从 2^256 空间中选择键。他们使用“password123”。知道了这一点,攻击者通常会成功地使用一个包含无限小部分可能密钥的字典来破坏设计不佳的加密系统。没有盐,预先计算的字典仍然摆在桌面上。这就是为什么*基于密码的加密标准,PKCS #5,*需要*使用盐,这也是 CMS (S/MIME) 一起使用密钥派生盐和密码模式 IV(或随机数)的原因。它们是正交的。 (2认同)

vy3*_*y32 6

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

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

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

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

顺便说一句,这些天我们称之为"Rijndael"AES.

  • IV和盐用于类似目的:它们确保否则相同的输入产生不可预测的输出.然而,关键的衍生盐并不能消除对IV的需要.通过为每条消息选择新的IV,可以使用相同的密码来加密许多消息.即使某些消息相同,攻击者也无法分辨. (2认同)
  • 盐用于散列而不是加密。 (2认同)
  • 盐用于密码散列,有时使用加密函数而不是散列函数来完成。 (2认同)