Rfc2898DeriveBytes - 密码长度

时间:2014-02-28 16:38:15

标签: c# encryption pbkdf2

长期试图找到相关答案,但尚未确信。

我正在尝试使用RijndaelManaged进行加密。要创建Key,我将密码,盐和迭代传递给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 个答案:

答案 0 :(得分:0)

假设攻击者不知道“常数”,那么,是的,它会通过使暴力攻击变得更加有效来提高安全性。但是,这是一个非常糟糕的假设,您应该始终认为攻击者拥有您的源代码。

继续我们的错误假设:如果有足够的密码破解,攻击者最终可能会找出你的常数是正确的。

关于是否在密码中添加更多字符可以改善密钥派生:不是真的。无论如何,您生成的密钥都是相同的长度。但攻击者不会试图猜测你的钥匙,它们太长而且实际上不可能蛮力。任何攻击者都会去密码。

这是迭代,盐和难以猜测长密码的地方。迭代通过增加每次猜测所需的时间来增加难度。虽然合法用户登录时进行数千次迭代的时间可以忽略不计,但暴力攻击者的成本却很高。长密码还会增加蛮力的难度。 salt有助于保护同一密码不被同时解密(攻击者必须独立攻击每个密码,即使它们是相同的。)