加密并部署app.config

21

我阅读并测试了很多内容,以找到加密和部署app.config至不同机器的最佳实践。一般来说,我希望将连接字符串的内容保护起来,以防被第三方获取,并将应用程序部署在不同的机器上。我 不会 手动配置每台机器。

我知道有几种方法,例如:

  • 使用Aspnet_Regiis (RSAProtectedConfigurationProvider、DPAPIProtectedConfigurationProvider)绑定到机器、用户或自定义。RSA加密密钥。

  • System.Security.Cryptography.ProtectedData 绑定到机器或用户。

  • 在第一次执行时对app.config 进行加密。但这不是安全的方法。

你推荐什么或者说加密app.config 的最佳实践是什么,并通过设置或复制&粘贴提供应用程序给不同的机器?

2个回答

12

步骤 1 创建一个RSA密钥对

aspnet_regiis -pc yourkey -exp

步骤2 将您的密钥导出为 XML 文件

aspnet_regiis -px yourkey keyfile.xml -pri

对于每台机器

第三步 导入您的容器

aspnet_regiis -pi yourkey keyfile.xml (see step 2)

对于每台机器

步骤4 编辑 machine.config(规范路径为 C:\Windows\Microsoft.NET\Framework[64|32]\v[Version]\Config)

configProtectedData 部分中添加以下元素,并设置 defaultProvider="YourProvider"

<add name="YourProvider"
                type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                description="Uses RsaCryptoServiceProvider to encrypt and decrypt for my infrastucture"

                keyContainerName="yourkey"

                cspProviderName=""
                useMachineContainer="true"
                useOAEP="false" />

然后您可以在一台机器上加密并粘贴到另一台机器上,记得必须为用户授予权限

aspnet_regiis -pa yourkey [DOMAIN\USER]

管理员组已经被授权。

有关更多信息,请参见http://msdn.microsoft.com/en-us/library/yxw286t2(v=vs.90).aspx

当然,这些步骤可以放在PowerShell /批处理文件中。

通过代码加密connectionStrings部分的另一种方法是

 var connectionStrings = ConfigurationManager.GetSection("connectionStrings") 
 if(!section.SectionInformation.IsProtected)
     connectionStrings.SectionInformation.ProtectSection("YourProvider");

在一个连接的客户端/服务器方案中,我提出了一种解决方案,我在一个广泛的网络中采用的做法是不在app.config中分发连接字符串,而是在用户验证之后通过一个服务(可以是Web服务或RESTful服务)要求连接的信息。

大致上的步骤如下:

  1. 验证用户
  2. 使用用户名作为参数,在服务中要求连接信息(HTTPS协议)
  3. 服务返回连接字符串
  4. 应用连接到数据库

通过这个解决方案,您可以选择用户连接哪个服务器,如果您有地区服务器或更多服务器的话。

希望有所帮助。


我需要为每台机器使用相同的RSA密钥对吗?每个将执行应用程序的域用户都需要密钥权限吗? - Andre Hofmeister
是的,您必须在所有机器上使用相同的密钥,并将权限授予仅应用程序池用户,即网络服务或应用程序池标识符。 - Fabio
通常,我需要它用于内部网络。解决方案运行良好,但我会再等一会儿。也许有一种解决方案可以不配置客户端机器。无论如何,非常感谢!我认为在第二步中您还需要导出私钥。使用 aspnet_regiis -px yourkey keyfile.xml -pri 即可。 - Andre Hofmeister
抱歉,我的错误。我已经更新了我的帖子,并提供了另一种可能的解决方案。 - Fabio
因此,拥有特权的每个用户都可以解密数据,对吗?因此,用户可以访问连接字符串中的密码? - Andre Hofmeister
显示剩余3条评论

3
如我在问题中已经提到的,有许多不同的方法可以加密配置文件。为了从广泛的角度描述,我想介绍一种额外的机会。我不会描述具体实现,更多的是概念。
通过msi安装程序中的自定义操作,您可以直接使用Windows数据保护API(DPAPI)加密配置文件。为了保护第二个熵,您可以使用混淆器。结果是,只有应用程序能够加密配置文件。 优点
  • 非常安全。
  • 不需要机器配置。
  • 在设置期间插入凭据。
缺点
  • 配置文件在安装过程中未加密。您必须保护它(权限)。
请随意讨论并对此答案提出反馈。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接