长期试图找到相关答案,但尚未确信。
我正在尝试使用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);
.....
}
欢迎任何积极或消极的评论和回应。
答案 0 :(得分:0)
假设攻击者不知道“常数”,那么,是的,它会通过使暴力攻击变得更加有效来提高安全性。但是,这是一个非常糟糕的假设,您应该始终认为攻击者拥有您的源代码。
继续我们的错误假设:如果有足够的密码破解,攻击者最终可能会找出你的常数是正确的。
关于是否在密码中添加更多字符可以改善密钥派生:不是真的。无论如何,您生成的密钥都是相同的长度。但攻击者不会试图猜测你的钥匙,它们太长而且实际上不可能蛮力。任何攻击者都会去密码。
这是迭代,盐和难以猜测长密码的地方。迭代通过增加每次猜测所需的时间来增加难度。虽然合法用户登录时进行数千次迭代的时间可以忽略不计,但暴力攻击者的成本却很高。长密码还会增加蛮力的难度。 salt有助于保护同一密码不被同时解密(攻击者必须独立攻击每个密码,即使它们是相同的。)