1

良い一日!

プロジェクトのセキュリティスキーマを考えましたが、それが非常に安全かどうかに興味があります。

データベースに、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 をプレーンテキスト以外に保存する方法を見つけることです。

どう思いますか?

4

0 に答える 0