使用.Net持久存储加密数据
我需要在应用程序运行之间存储加密的数据(少量小字符串)。我不希望用户每次启动应用程序时都提供密码。 IE。毕竟,它归结为安全存储加密密钥。
我一直在研究RSACryptoServiceProvider并使用PersistentKeyInCsp,但是我不确定它是如何工作的。密钥容器在应用程序运行或者计算机重新启动之间是否持久存在?如果是,是用户专用还是机器专用。 IE。如果我将加密的数据存储在用户的漫游配置文件中,如果用户登录到另一台计算机,可以解密该数据吗?
如果上述方法不起作用,我有什么选择(我需要处理漫游配置文件)。
解决方案
数据保护API(DPAPI)完全可以满足需求。它使用机器或者(更好)用户的凭据作为加密密钥,对任意数据进行对称加密。我们不必担心管理密钥。 Windows会帮我们解决这个问题。如果用户更改了密码,Windows将使用用户的新密码重新加密数据。
DPAPI在.NET中通过System.Security.Cryptography.ProtectedData类公开:
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);
尽管我们需要将加密的数据存储在各种机器可以访问的位置(网络共享,带有IsolatedStorageScope.Roaming的IsolatedStorage)等,但DPAPI可以与漫游配置文件(如此处所述)正常工作。
有关更多信息,请参见MSDN中的ProtectedData类。这里有一个DPAPI白皮书,其中包含比我们想要的更多的信息。
我想添加到DPAPI方法中。
尽管我自己还没有实现用户存储方法,但是有Microsoft文档提供了一种用户存储方法,该方法可以加密和解密特定用户的数据。
我在机器存储中使用了DPAPI。如果适合需求,我将对其进行描述。我使用Windows服务来加载Windows用户配置文件,并且该用户的密码用于加密数据。
附带说明一下,DPAPI使用的Triple-DES可能比AES稍弱(但比AES弱),但是我不确定我们要寻找的保护类型。
Windows数据保护
http://msdn.microsoft.com/en-us/library/ms995355.aspx