在具有用户存储的Web场环境中使用DPAPI / ProtectedData

时间:2008-10-14 16:21:00

标签: asp.net encryption web-farm dpapi

我想知道是否有人在网络农场环境中成功使用DPAPI与用户商店?

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

由于我们在Web场环境中运行,因此我们无法保证执行加密的计算机将成为解密它的计算机。 (也因为机器故障不应该破坏我们的加密数据)。

所以我们拥有的是一个服务组件,它在我们每个Web框上的特定用户帐户下的服务中运行。根据推荐,此用户设置为具有漫游配置文件。

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

  

'密钥无法在指定状态下使用'。

我怀疑这是因为我在多台机器上将加密服务作为用户运行时犯了一个错误,因此保持用户同时登录多台计算机。

如果这是问题,那么其他人如何在Web场环境中使用DPAPI与用户存储?

4 个答案:

答案 0 :(得分:8)

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

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

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

缺点是明文密钥可能在初始安装过程中短时间内存在于本地磁盘上,可能会暴露给操作人员。您可以添加额外的加密层,例如使用web.config machineKey,如果这是一个问题。

答案 1 :(得分:3)

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

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

希望有所帮助!

答案 2 :(得分:2)

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

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

似乎DPAPI无法在服务器场中运行。我认为这对微软来说是一个相当大的疏忽,使得DPAPI在大多数企业应用程序中几乎无用。

答案 3 :(得分: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();
}