4

我已经使用 .NET 中的 Rijndael/AES 加密提供程序实现了加密功能。我对算法的“理解”表明,只要密钥和 IV 不被泄露,那么数据就是安全的。但是,我在一些网站上阅读过,其中盐渍密码是最佳做法。让我感到困惑的是,似乎只有基于哈希函数的加密才需要加盐。 使用 Rijndael 或 AES 时的最佳做法是什么,应该加盐什么值(明文、密钥、IV)?

4

5 回答 5

5

如果您使用相同的密钥和相同的 IV 加密不同的数据集,则相同的明文总是会产生相同的加密文本。如果多个用户拥有相同的密码,他们也将拥有相同的加密密码,并且从加密数据中可以明显看出他们的密码是相同的。

如果您在每次加密之前将盐添加到明文中,相同的密码将导致不同的加密字符串,因为(通常)在每种情况下使用不同的盐。

因此,如果您对所有密码加密使用相同的密钥和 IV,则场景与使用散列函数时相同,并且使用 salt 具有相同的优势。如果您对每次加密使用不同的密钥或 IV,相同的密码会导致不同的加密文本,并且您不会遇到这些问题。在这种情况下,加盐不会改善任何东西。

于 2011-01-04T17:29:02.187 回答
4

IV盐。在通过网络发送密文或将密文保存到磁盘时,将 IV 添加到密文之前是非常安全的。确保 IV 是由每个消息的加密强伪随机数生成器生成的。

在强密码学中,唯一的秘密就是密钥。IV 不是秘密,密文也不是。

但是,如果您使用相同的IV和相同的密钥进行多次加密(“会话 IV”),那么您必须像保护密钥一样保护 IV。

于 2011-01-04T17:00:00.323 回答
3

Salt只对哈希有意义;它可以防止预先计算的字典。

使用盐进行加密没有任何价值。

于 2011-01-04T16:59:07.053 回答
2

如果密钥是从密码派生的,则密钥派生算法应包括盐。主流算法(例如PBKDF2)可以。

对于加密部分,已建立的操作模式都包括一个 IV,在某种程度上,它本身类似于盐。在加密之前没有必要进一步随机化数据。

于 2011-01-04T23:59:29.487 回答
1

IV 对于公众知识是安全的,通常您希望为每个加密操作生成一个新的。如果您每次都使用相同的密文,那么您将为相同的加密值生成相同的密文。这在某种程度上是破解 WEP 加密的方式。(http://en.wikipedia.org/wiki/Initialization_vector)

散列您要加密的值对您没有多大作用。IV 已经在密文中引入了一个随机化因子,您不希望必须从解密值中解析出盐值。

正如 SLaks 所提到的,加盐仅对哈希有用。为了进一步实现这一点,您将要与另一个散列进行比较以查看两次放入散列函数的值是否相同,这很有用。盐可以防止字典攻击(又名彩虹表),人们已经经历并预先计算了几个输入的哈希值。盐意味着必须为每个盐值生成计算表。

您还可以使用盐值做更多事情,但这是一个示例。

于 2011-01-04T17:10:24.223 回答