5

我想知道是否有人在网络农场环境中成功地将 DPAPI 与用户存储一起使用?

因为我们的应用程序是最近从 1.1 转换为 2.0 的 ASP.NET 应用程序,所以我们使用了一个直接调用CryptUnprotect方法的自定义包装器。但这应该与ProtectedData2.0框架中可用的方法相同。

因为我们在网络农场环境中运行,我们不能保证进行加密的机器将是解密它的机器。(也因为机器故障不应该破坏我们的加密数据)。

因此,我们拥有的是一个服务组件,它在我们每个 web 盒子上的特定用户帐户下的服务中运行。根据建议,此用户设置为具有漫游配置文件。

我们遇到的问题是,在一台机器上加密的信息无法在另一台机器上解密,这会因 win32 错误而失败:

'密钥在指定状态下无效'。

我怀疑这是因为我犯了一个错误,让加密服务以用户身份在多台机器上运行,因此让用户同时在多台机器上登录。

如果这是问题所在,那么如何在网络场环境中将 DPAPI 与用户存储一起使用?

4

4 回答 4

9

在 Web 场环境中,您不会使用 DPAPI 直接加密/解密您的数据,而是使用它来加密稍后用于解密受保护数据的密钥。

作为部署过程的一部分,您可以将密钥“安装”到每台服务器上。安装脚本需要以 AppPool 的身份运行,并且可以将加密密钥存储在 app.config 文件或注册表中。

加密数据本身可以存储在中央存储库/数据库中,以便场中的所有服务器都可以访问它。要解密数据,Web 应用程序将从安装位置检索加密密钥,使用 DPAPI 对其进行解密,然后使用结果解密来自中央存储库的数据。

缺点是在初始安装过程中,明文密钥可能会在本地磁盘上存在很短的时间,在那里它可能会暴露给操作人员。如果担心的话,您可以添加额外的加密层,例如使用 web.config machineKey。

于 2011-12-27T02:10:12.130 回答
3

我刚看到这个。有一种方法可以完成这项工作,那就是确保农场中的机器在域中,并使用域帐户来加密和解密数据(即;在域帐户下运行应用程序)

您不能以您希望的方式对本地帐户使用 DPAPI,因为密钥材料不会在服务器之间交换。

希望有帮助!

于 2010-03-25T23:22:22.873 回答
3

微软的海报是错误的。 http://support.microsoft.com/default.aspx?scid=kb;en-us;309408#6

“为使 DPAPI 在使用漫游配置文件时正常工作,域用户只能登录到域中的一台计算机。如果用户想要登录到域中的另一台计算机,则用户必须注销用户登录到第二台计算机之前的第一台计算机。如果用户同时登录到多台计算机,DPAPI 很可能无法正确解密现有的加密数据。

DPAPI 似乎无法在农场环境中工作。我认为这是微软的一个相当大的疏忽,使得 DPAPI 对于大多数企业应用程序几乎毫无用处。

于 2010-11-23T15:55:53.447 回答
0

十二年后。. . 您可以尝试使用CNG DPAPI,它适用于可能会或可能不会负载平衡的云环境。从该链接(以防它被删除):

Microsoft 在 Windows 2000 中引入了数据保护应用程序编程接口 (DPAPI)。该 API 由两个函数组成,CryptProtectData 和 CryptUnprotectData。DPAPI 是 CryptoAPI 的一部分,适用于对使用密码学知之甚少的开发人员。这两个函数可用于加密和解密单台计算机上的静态数据。

然而,云计算通常要求在一台计算机上加密的内容在另一台计算机上解密。因此,从 Windows 8 开始,Microsoft 将使用相对简单的 API 的想法扩展到涵盖云场景。这个名为 DPAPI-NG 的新 API 使您能够安全地共享机密(密钥、密码、密钥材料)和消息,方法是将它们保护到一组主体中,这些主体可用于在适当的身份验证和授权后在不同的计算机上取消保护它们。

在 .NET Core 中,这看起来像

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .ProtectKeysWithDpapiNG();
}
于 2020-07-30T23:54:28.830 回答