19

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

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

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

4

2 回答 2

38

数据保护 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);

DPAPI 可以与漫游配置文件一起正常工作(如此所述),但您需要将加密数据存储在您的各种机器可以访问的位置(网络共享、IsolatedStorage 和IsolatedStorageScope.Roaming等)。

有关详细信息,请参阅 MSDN 中的 ProtectedData 类。这里有一份 DPAPI 白皮书,其中包含比您想要的更多的信息。

于 2008-09-30T19:53:41.763 回答
0

我想添加到 DPAPI 方法。

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

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

附带说明一下,DPAPI 使用的 Triple-DES 可能稍弱(比 AES),但我不确定您正在寻找哪种类型的保护。

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

于 2008-09-30T20:02:46.077 回答