良い一日!
プロジェクトのセキュリティスキーマを考えましたが、それが非常に安全かどうかに興味があります。
データベースに、Salt として使用する GetNonZeroBytes(byte[16] object) メソッドの RNGCryptoServiceProvider() base64 文字列を保存しました。
次に、Salt を使用してパスワードの Scrypt 暗号化を生成します (bCrypt と同様に、RAM の量などを選択できるようにするだけです。このシナリオでは、8 MB の RAM を使用してパスワードを暗号化します)。 . 以前の出力とソルトを使用して、Rfc2898DeriveBytes(暗号化された出力、ソルト、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 を生成します。これは、データベースにデータを暗号化するために使用するものであり、したがって、このアルゴリズムでは、パスワードをどこにも保存する必要はありません。データを復号化するために、ユーザーが書いたパスワードが有効かどうかを確認します。そうであれば、ユーザーは認証されています。
ハッカーの主な目的はデータを取得することであるため、パスワードが必要です。パスワードを知っていれば、ログインしてデータを取得するか、DB 内のデータを復号化できます。彼がパスワードを取得するには、一致するものが見つかるまでそのバージョンの bCrypt を Salt で実行する必要があり、DB からデータを復号化するには、その Rfc2898DerivedBytes で RijndaelManaged を実行する必要があります。
これをさらに安全に行う唯一の方法は、Salt をプレーンテキスト以外に保存する方法を見つけることです。
どう思いますか?