再会!
我已经想到了一个项目的安全模式,我很好奇它是否非常非常安全。
我已将 GetNonZeroBytes(byte[16] object) 方法的 RNGCryptoServiceProvider() base64 字符串存储在数据库中,我将其用作 Salt。
接下来,我使用 Salt 生成密码的 Scrypt 加密(就像 bCrypt 一样,只是它允许我选择 RAM 的数量和其他类似的东西 - 在这种情况下,我使用 8mb 的 RAM 来加密密码) . 我使用之前的输出和 Salt 来初始化 Rfc2898DeriveBytes(encrypted output, 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);
}
我用它来为块大小为 256 的 RijndaelManaged 算法生成密钥和 IV。这是我用来将数据加密到数据库中的,因此对于这个算法,我不必将密码存储在任何地方:我所拥有的要做的是检查用户写入的密码是否正确,以便解密数据。如果是,则对用户进行身份验证。
因为黑客的主要目的是获取数据,所以他需要密码。如果他有密码,他可以登录并获取数据或解密数据库中的数据。为了让他获得密码,他必须使用 Salt 运行该版本的 bCrypt,直到找到匹配项,然后从数据库中解密数据,他必须这样做并使用该 Rfc2898DerivedBytes 运行 RijndaelManaged。
我认为这样做更安全的唯一方法是找到一种以明文形式存储 Salt 的方法。
你怎么看?