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

时间:2008-09-30 18:53:59

标签: c# encryption dns roaming

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

我正在研究RSACryptoServiceProvider并使用PersistentKeyInCsp,但我不确定它是如何工作的。密钥容器在应用程序运行或机器重启之间是否持久存在?如果是,是用户特定的还是特定于机器的。即如果我将加密数据存储在用户的漫游配置文件中,如果用户登录其他计算机,我可以解密数据吗?

如果上述方法不起作用,我的选择是什么(我需要处理漫游配置文件)。

2 个答案:

答案 0 :(得分:38)

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可以正常使用漫游配置文件(如here所述),但您需要将加密数据存储在一个地方(网络共享,带有IsolatedStorageScope.Roaming的IsolatedStorage等)中机器可以访问。

有关详细信息,请参阅MSDN中的ProtectedData类。有一篇DPAPI白皮书here,提供的信息比您想要的更多。

答案 1 :(得分:0)

我想补充DPAPI方法。

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

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

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

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