3

私のアプリケーションでは、さまざまな設定とパスワードを暗号化する必要があります。これまでのところ、次のように RijndaelManaged クラスなどでこれを行ってきました。

/// <summary>
/// Encrypts the string defined by parameter "data" and returns the encrypted data as string
/// </summary>
/// <param name="data">Data to be encrypted</param>
/// <returns>The encrypted data</returns>
public static string Encrypt(string data)
        {
            if (data == "")
                return "";

            byte[] bytes = Encoding.ASCII.GetBytes(initVector);
            byte[] rgbSalt = Encoding.ASCII.GetBytes(saltValue);
            byte[] buffer = Encoding.UTF8.GetBytes(data);
            byte[] rgbKey = new PasswordDeriveBytes(passPhrase, rgbSalt, hashAlgorithm, passwordIterations).GetBytes(keySize / 8);
            RijndaelManaged managed = new RijndaelManaged();
            managed.Mode = CipherMode.CBC;
            ICryptoTransform transform = managed.CreateEncryptor(rgbKey, bytes);
            MemoryStream memStream = new MemoryStream();
            CryptoStream cryStream = new CryptoStream(memStream, transform, CryptoStreamMode.Write);
            cryStream.Write(buffer, 0, buffer.Length);
            cryStream.FlushFinalBlock();
            byte[] inArray = memStream.ToArray();
            memStream.Close();
            cryStream.Close();
            return Convert.ToBase64String(inArray);
        }

通常の問題は、passPhrase (および saltValue) をどこかに保存する必要があることです。passPhrase を次の方法で保存するために、次のように DPAPI Protect() および Unprotect() クラスに出会いました。

/// <summary>
/// Use Windows' "Data Protection API" to encrypt the string defined by parameter "clearText".
/// To decrypt, use the method "Unprotect"
/// http://www.thomaslevesque.com/2013/05/21/an-easy-and-secure-way-to-store-a-password-using-data-protection-api/
/// </summary>
/// <param name="clearText"></param>
/// <param name="optionalEntropy"></param>
/// <param name="scope"></param>
/// <returns></returns>
        public static string Protect(string clearText, string optionalEntropy = null, DataProtectionScope scope = DataProtectionScope.CurrentUser)
        {
            if (clearText == null)
                throw new ArgumentNullException("The parameter \"clearText\" was empty");
            byte[] clearBytes = Encoding.UTF8.GetBytes(clearText);
            byte[] entropyBytes = string.IsNullOrEmpty(optionalEntropy) ? null : Encoding.UTF8.GetBytes(optionalEntropy);
            byte[] encryptedBytes = ProtectedData.Protect(clearBytes, entropyBytes, scope);
            return Convert.ToBase64String(encryptedBytes);
        }

私の質問は次のとおりです: DPAPI を使用すると、暗号化方法のパスフレーズを安全な方法で保存できるようになりましたが、DPAPI を使用してすべての設定を直接暗号化しないのはなぜですか? これにより、意図されていない量のデータで DPAPI がいっぱいになりますか?

私の考えは、次のことをする代わりにでした:

string setting1 = ”mySettingValue1”;
StoreSettingSomewhere(Encrypt(setting1));

私は次のことができます:

string setting1 = ”mySettingValue1”;
StoreSettingSomewhere(Protect(setting1, bla bla bla));

DPAPI を使用する場合、同じマシン (または同じユーザー) で復号化する必要があることはわかっていますが、これは私の場合は問題になりません。

どんな助けでも大歓迎です!

4

1 に答える 1

2

データ保護 API は、暗号化したいものの暗号化 (ソルト化およびハッシュ化) された結果である不透明な BLOB を返します。

DP API を「いっぱいにする」ことはできません。自分で「いっぱいにする」だけです(ブロブはやや大きいため、後で暗号化されたデータを検証するために必要なものがすべて内部的に含まれています)。

Data Protection API の欠点は、ユーザーとしてログインする必要があることです。また、ユーザー間で設定を共有することはできません (マシン全体のスコープを使用しない限り)。

于 2016-01-15T22:28:12.543 に答える