【发布时间】:2014-04-01 18:51:39
【问题描述】:
找了半天相关的答案,还是不信。
我正在尝试使用 RijndaelManaged 进行加密。为了创建密钥,我将密码、盐和迭代传递给 Rfc2898DeriveBytes。
如果用户输入的密码低于特定长度,我正在考虑添加常量,然后再将其传递给 Rfc2898DeriveBytes。
到目前为止,我发现添加常量不会为安全性增加任何好处。假设攻击者可以访问包含加密数据和盐的数据库,但不保持不变会给他带来一些困难。虽然最终他会找到那个不变的。
或者将任意长度的密码传递给 Rfc2898DeriveBytes 是“非常安全的”而不用担心?
传递更短或更长的密码是否会影响密钥派生过程,哪个更好和最推荐?
到目前为止,我所知道的随机盐和更多迭代很重要。
以下是代码,我应该删除在密码中添加常量还是保留它?
(注:用户密码长度限制不适用于GUI,用户可以传递1个字符甚至超过10个字符)
string constant = "AnyConstantToMakePasswordBigger";
if (password.Length < 8)
{
password = password + constant;
}
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] salt = new byte[8];
rng.GetBytes(salt);
Rfc2898DeriveBytes derivedKey = new Rfc2898DeriveBytes(password, salt, 1000);
using (RijndaelManaged aes = new RijndaelManaged())
{
aes.Key = derivedKey.GetBytes(keyLength);
.....
}
欢迎任何正面或负面的评论和回应。
【问题讨论】:
-
唯一的解决方案是要求用户输入至少一定长度的密码。添加一个常量或更多轮数并不能弥补 1 个字符的密码。
-
是的,盐和更多的迭代更重要。事实上,更多的迭代正是 BCrypt 所做的。我不认为添加常量数据来制作“更长的密码”会产生很大的不同——你不会改变密码的有效安全深度。
-
添加常量是没有意义的。盐已经达到了你希望常数实现的目的。事实上,添加常量可能会使安全性变得更糟(尽管我认为使用
Rfc2898DeriveBytes会很安全)。如果您想提高安全性,请确保密码超过最小长度。 -
@Jordell,即使提供的密码也只有 1 个字符的长度? (请注意开头不能限制长度)
-
用固定值填充密码有什么帮助?你想增加熵而不是减少它。
标签: c# encryption pbkdf2