【问题标题】:Decrypting ConnectionString解密连接字符串
【发布时间】:2011-10-26 14:40:47
【问题描述】:

我一直在阅读有关 C#/ASP 应用程序的 web.config 某些部分的加密和解密的信息,并且我成功地为我的应用程序加密了 web.config 的连接字符串。我的问题是解密。我正在使用标准代码进行加密和解密,但它修改了 web.config。在本地它工作正常,因为当它修改 web.config 时我可以保存它并且它仍然会运行,但是当我将它上传到远程服务器时它就不起作用了。

我得到的错误是

配置错误说明:在安装过程中发生错误 处理服务此请求所需的配置文件。 请查看下面的具体错误详细信息并修改您的 适当的配置文件。

解析器错误消息:无法使用提供程序解密 'RsaProtectedConfigurationProvider'。来自提供商的错误消息: 不良数据

加密

try
{
    Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
    ConfigurationSection section = config.GetSection("connectionStrings");
    if (!section.SectionInformation.IsProtected)
    {
       section.SectionInformation.ProtectSection("RSAProtectedConfigurationProvider");
       config.Save();
    }
    catch (Exception ex)
    { 

    }

解密

Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
ConfigurationSection section = config.GetSection("connectionStrings");
if (section.SectionInformation.IsProtected)
{
    section.SectionInformation.UnprotectSection();
    config.Save();
}

每当页面加载时我都会调用解密方法,但它不起作用,它给了我上面的错误。

我根本无法访问主机服务器。所以使用命令行不是一个选项。

【问题讨论】:

  • 只是好奇,为什么您需要手动解密应用中的连接字符串?只需访问WebConfigurationManager.ConnectionStrings 即可为您解密配置文件(如果已加密)。
  • 这只是交给我的设计。我现在正在修改代码来做到这一点。我将连接字符串从后面的 C# 代码分配给 ASP SQLDataSource。
  • 我尝试在后面的代码中分配它,但仍然出现错误。我在 page_load 期间为其中一个 asp 页面放置了代码以进行测试。
  • 字符串 cString = WebConfigurationManager.ConnectionStrings["NameOfConnectionString"].ConnectionString; NameOfSqlDataSource.ConnectionString = cString;
  • 您是否尝试过在 .aspx 页面中以声明方式分配连接字符串?类似<asp:SqlDataSource ConnectionString="NameOfConnectionString"

标签: c# asp.net .net connection-string


【解决方案1】:

确保在您本地拥有的远程服务器上提供相同的解密密钥。这将是machine key element

【讨论】:

  • 我想要,但我无权访问该远程服务器。任何其他方式或方式我可以加密不涉及将文件导入服务器的连接字符串?
  • 只需要在远程web.config中添加machineKey设置即可。您可以访问它 - 对吧?如果没有 - 你无法修复它。
  • 我可以访问它,我现在正在添加机器密钥代码,我将对其进行测试。 4GuysGonnaRolla 在我阅读他们的文章时没有提到这一点。 =/
  • 我添加了一个机器密钥代码,但我仍然遇到同样的错误。这是我放置在 标记内的示例机器密钥代码。
【解决方案2】:

您可以create and export an RSA Key Container,但您仍需要访问远程服务器才能导入容器。

顺便说一句,我不相信 machineKey 元素在这里是相关的。来自 MSDN:

具有本地机器范围的密钥容器 (useMachineContainer"true") 存储在 %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys 的隐藏文件夹中

【讨论】:

    【解决方案3】:

    我猜这种情况是您尝试在本地加密 web.config,然后再将其推送到您的托管服务提供商/远程服务器。 Steve Rowbotham 对这个问题的回答是正确的,因为您需要在开发机器和远程服务器上使用相同的 RSA 密钥容器才能在本地加密和远程解密。

    您能否在部署过程中采用不同的方式并加密 web.config?我们使用 MsDeploy 在部署期间处理加密配置文件,如果您愿意,我可以提供一些示例代码。

    或者,当您首次加载应用程序时(在 global.asax 中的 Application_Start 事件期间),您可以检查 web.config 的 connectionStrings 部分是否已加密,然后对其进行加密。您不必手动解密 web.config...

    【讨论】:

    • 我不确定如何使用 MsDeploy。虽然如果它与远程服务器有任何关系,那么几乎不可能修改它上面的任何内容。请求此类更改的繁文缛节将花费超过申请分配的时间。
    • 那么基本上改变远程服务器上的任何东西都是不可能的吗?如上所述,我会尝试在 Application_Start 事件中加密 connectionStrings。这样一来,您的应用就会负责进行加密,并且您不需要除此之外的任何其他内容。
    猜你喜欢
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    相关资源
    最近更新 更多