使用.Net持久存储加密数据

我需要在应用程序运行之间存储加密数据(很少的小字符串)。 我不希望用户每次启动应用程序时都提供密码。 也就是说,它可以安全地存储加密密钥。

我正在研究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白皮书,提供了比你想要的更多的信息。

我想补充DPAPI方法。

虽然我自己没有实现用户存储方法,但是有一个用户存储方法的Microsoft文档,它为特定用户加密和解密数据。

我使用机器商店的DPAPI。 我会描述它,以防它适合你想要做的事情。 我使用Windows服务加载Windows用户配置文件,该用户的密码用于加密数据。

作为旁注,DPAPI使用Triple-DES,可能稍微弱一些(比AES),但后来我不确定您正在寻找什么类型的保护。

Windows数据保护http://msdn.microsoft.com/en-us/library/ms995355.aspx