我需要在应用程序运行之间存储加密数据(很少的小字符串).我不希望用户每次启动应用程序时都提供密码.也就是说,它可以安全地存储加密密钥.
我正在研究RSACryptoServiceProvider并使用PersistentKeyInCsp,但我不确定它是如何工作的.密钥容器在应用程序运行或机器重启之间是否持久存在?如果是,是用户特定的还是特定于机器的.即如果我将加密数据存储在用户的漫游配置文件中,如果用户登录其他计算机,我可以解密数据吗?
如果以上不起作用,我有什么选择(我需要处理漫游配置文件).
Data Protection API(DPAPI)完全符合您的要求.它使用机器的凭证或(更好的)用户作为加密密钥,提供任意数据的对称加密.您不必担心管理密钥; Windows会为您解决这个问题.如果用户更改了密码,Windows将使用用户的新密码重新加密数据.
使用System.Security.Cryptography.ProtectedData类在.NET中公开DPAPI:
byte[] plaintextBytes = GetDataToProtect(); byte[] encodedBytes = ProtectedData.Protect(plaintextBytes, null, DataProtectionScope.CurrentUser);
Protect方法的第二个参数是可选的熵字节数组,可用作附加的特定于应用程序的"秘密".
要解密,请使用ProtectedData.Unprotect调用:
byte[] encodedBytes = GetDataToUnprotect(); byte[] plaintextBytes = ProtectedData.Unprotect(encodedBytes, null, DataProtectionScope.CurrentUser);
DPAPI正常工作与漫游配置文件(如描述在这里),但你需要加密的数据存储在一个地方(网络共享,IsolatedStorage与IsolatedStorageScope.Roaming等),你的各种机器可以访问.
有关详细信息,请参阅MSDN中的ProtectedData类.有一个DPAPI白皮书在这里,有比你以往任何时候都需要更多的信息.