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

Posted

技术标签:

【中文标题】密码、Salt 和 IV,我需要所有这些吗?【英文标题】:Passphrase, Salt and IV, do I need all of these? 【发布时间】:2010-12-26 16:21:19 【问题描述】:

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

我有什么不对吗?

【问题讨论】:

【参考方案1】:

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

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

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

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


更新:

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

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

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

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

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

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

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

【讨论】:

还有一点值得一提的是,如果你拥有除了IV之外的所有东西,你可以成功解密除了第一块明文之外的所有东西。 @AkashKava 不,我的说法是正确的。攻击者无法猜测 不可预测的被选择之前。如果盐是秘密的,攻击者即使在它被选中后也无法猜到。 CMS 等基于密码的加密协议的标准指定 unencrypted salt can be sent 与加密消息一起使用。可预测的 salt 允许攻击者预先计算常见密码的加密密钥,并多次重复使用该表以快速解密消息。 @AkashKava “我正在帮助攻击者通过不猜盐来减少时间。”仅当您的密码非常弱且盐负责派生密钥中的熵时,这才是正确的。如果密码本身很强大,那么知道盐对攻击者没有帮助。密码的保密性来自其存储:在您的大脑或钱包中。你会如何保守盐的秘密?如果你可以保守一个盐的秘密,你为什么需要密码?在这种情况下,盐本身可以用作预共享密钥。 Salt 用于防止攻击者在时空权衡中预先计算密钥。 @user12861 salt 可防止预计算字典攻击。假设攻击者有一个最常选择的密码列表。为每个人派生一个密钥需要很长时间(因为 KDF 的“迭代计数”),但没有盐,他只需执行一次并存储结果。然后,他可以非常快速地尝试使用这些派生密钥中的每一个对给定消息进行解密,寻找纯文本的预期特征,看看他是否有匹配项。使用盐,这种攻击的空间要求变得令人望而却步。你在阅读什么建议? @user12861 您的问题为我们提供了一些有用的答案,没有任何浪费【参考方案2】:

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

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

【讨论】:

否定。 IV不被认为是机密的,实际上需要与加密数据一起存储,否则数据无法解密。 圣诞快乐,为什么要投反对票,downvoter?我根据八年前的评论更正了这一点。【参考方案3】:

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

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

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

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

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

【讨论】:

IV 和 salt 的用途相似:它们确保否则相同的输入会产生不可预测的输出。但是,密钥派生盐并不能排除对 IV 的需要。通过为每条消息选择一个新的 IV,可以使用相同的密码来加密许多消息。即使某些消息是相同的,攻击者也无法分辨。 看来 OP 正在使用 Rijndael CBC 的基于密码的加密(并且 Rijndael 和 AES 并不完全相同 - AES 实际上是 Rijndael 的一个子集;前者具有固定的 128 位blocksize,而后者有一个可变的blocksize)。 盐用于散列而不是加密。 盐用于密码散列,有时使用加密函数而不是散列函数来完成。

以上是关于密码、Salt 和 IV,我需要所有这些吗?的主要内容,如果未能解决你的问题,请参考以下文章

PlayStore 报告了 Unsafe Cryptographic Encryption Error 但我必须使用静态密钥、iv 和 salt

如何使用 BouncyCastle 解密,使用 GCM Tag 的字符串,IV 字符串和密钥字符串,所有这些都是十六进制的?

使用 SHA-512 和 salt 来散列 MD5 散列密码?

PHP中的密码安全性

转载 C#使用Salt + Hash来为密码加密

Web安全--使用Salt + Hash将密码加密后再存储进数据库