Почему бы не использовать DPAPI для шифрования всех настроек, а не только для шифрования основного пароля?

В моем приложении мне нужно зашифровать различные настройки и пароль. До сих пор я делал это с классом 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 я могу безопасно хранить passPhrase для своего метода шифрования, но почему бы мне просто не использовать DPAPI для непосредственного шифрования всех моих настроек? Заполнит ли это DPAPI объемом данных, для которых он не предназначен?

Моя идея была вместо того, чтобы делать следующее:

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

Я мог бы сделать следующее:

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

Я знаю, что при использовании DPAPI я должен расшифровать на той же машине (или с тем же пользователем), но это не будет проблемой в моем случае.

Любая помощь приветствуется!

1 ответ

Решение

API защиты данных возвращает вам непрозрачный большой двоичный объект, который является зашифрованным (и засоленным, и хешированным) результатом того, что вы хотели зашифровать.

Вы не можете "заполнить" DP API - вы бы только "заполнили" себя (так как большие объекты несколько большие, но они внутренне содержат все, что нужно для последующей проверки зашифрованных данных).

Недостатком API защиты данных является то, что вы должны войти в систему как пользователь; и вы не можете обмениваться настройками между пользователями (если вы не использовали масштаб всей машины).

Другие вопросы по тегам