在我的应用程序中,我需要加密各种设置和密码。 到目前为止,我一直在使用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)。 为了以sequre方式存储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时我必须在同一台机器上(或使用同一个用户)解密,但在我的情况下这不会有问题。
感谢任何帮助!
答案 0 :(得分:2)
Data Protection API会为您提供一个不透明的blob,它是您想要加密的加密(以及盐渍和散列)结果。
你不能&#34;填满&#34; DP API - 你自己只会&#34;填充&#34; (因为blob是有点大;但它们在内部包含了以后需要验证加密数据的所有内容。)
Data Protection API的缺点是您必须以用户身份登录;并且您无法在用户之间共享设置(除非您使用了机器范围)。