0

试图找到相关答案很长一段时间,但还没有被说服。

我正在尝试使用 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);
     .....
}

欢迎任何正面或负面的评论和回应。

4

1 回答 1

0

假设攻击者不知道“常数”,是的,它可以通过使蛮力攻击更难来有效地提高安全性。但是,这是一个非常糟糕的假设,您应该始终假设攻击者拥有您的源代码。

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

至于在密码中添加更多字符是否会改善密钥派生:并非如此。无论如何,您生成的密钥都将是相同的长度。但是攻击者不会试图猜测你的密钥,它们太长并且实际上不可能暴力破解。任何攻击者都会追求密码。

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

于 2014-02-28T16:50:21.567 回答