美好的一天!
我已经想到了项目的安全架构,我很好奇它是否非常非常安全。
我在数据库中存储了一个我用作Salt的GetNonZeroBytes(byte [16] object)方法的RNGCryptoServiceProvider()base64字符串。
接下来,我使用Salt生成密码的Scrypt加密(就像bCrypt,只是它允许我选择RAM的数量和其他类似的东西 - 在这种情况下,我使用8mb的RAM加密密码)。我使用输出和之前的Salt来初始化Rfc2898DeriveBytes(加密输出,Salt,10000)实例。
public static string GetBase64StringSafeString(string SaltSource, string StringToEncrypt, int memoryCost)
{
byte[] Salt = Encoding.ASCII.GetBytes(SaltSource);
byte[] derivedBytes = new byte[64];
SCrypt.ComputeKey(Encoding.ASCII.GetBytes(StringToEncrypt), (new Rfc2898DeriveBytes(SaltSource, Salt, 10000)).GetBytes(25), (memoryCost != 0 ? memoryCost : 8192), 8, 1, null, derivedBytes);
return Convert.ToBase64String(derivedBytes);
}
这用于为Blockize为256的RijndaelManaged算法生成密钥和IV。这是我用来将数据加密到数据库中的内容,因此对于这个算法,我不必将密码存储在任何地方:我所要做的就是检查用户写的密码是否良好以解密数据。如果是,则用户被认证。
因为黑客的主要目的是获取数据,所以他需要密码。如果他有密码,他可以登录并获取数据或解密数据库中的数据。为了获得密码,他必须使用Salt运行该版本的bCrypt,直到找到匹配并解密来自数据库的数据,他必须这样做并使用Rfc2898DerivedBytes运行RijndaelManaged。
我认为这样做更加安全的唯一方法是找到一种方法来存储除了明文之外的Salt。
你怎么看?