C# 解密连接字符串

C# 解密连接字符串,c#,asp.net,.net,connection-string,C#,Asp.net,.net,Connection String,我一直在阅读有关C#/ASP应用程序web.config某些部分的加密和解密的内容,我成功地为我的应用程序加密了web.config的连接字符串。我的问题是解密。我使用标准代码进行加密和解密,但它修改了web.config。在本地,它可以正常工作,因为当它修改web.config时,我可以保存它,它仍然会运行,但当我将它上载到远程服务器时,它就不工作了 我得到的错误是 配置错误说明:配置过程中发生错误 处理服务此请求所需的配置文件。 请查看下面的特定错误详细信息并修改您的 配置文件 分析器错误消

我一直在阅读有关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();
}
每当页面加载时,我调用解密方法,但它不工作,并且它给出了上面的错误


我根本没有访问主机服务器的权限。因此,使用命令行不是一个选项。

确保远程服务器上的解密密钥与本地服务器上的相同。这将是。

您可以,但仍需要访问远程服务器才能导入容器

我不认为machineKey元素与此相关。顺便说一句,来自MSDN:

具有本地计算机作用域(useMachineContainer“true”)的密钥容器存储在%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys的隐藏文件夹中


我猜情况是,在将web.config推送到宿主提供商/远程服务器之前,您试图在本地加密它。Steve Rowbotham对这个问题的回答是正确的,因为您的开发机器和远程服务器上都需要相同的RSA密钥容器,以便能够在本地加密和远程解密

作为部署过程的一部分,您可以采用不同的路径并加密web.config吗?我们使用MsDeploy在部署期间加密配置文件,如果您愿意,我可以提供一些示例代码


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

我想解密,但我没有访问该远程服务器的权限。有没有其他方法,或者我可以加密连接字符串,而不需要将文件导入服务器?您只需要在remote web.config中添加machineKey设置。你有权使用它-对吗?如果没有-你无法修复它。我有权访问它,我现在正在添加machinekey代码,我将测试它。4GuysGonnaRolla在我读他们的文章时没有提到这一点=/我添加了一个machinekey代码,但仍然得到相同的错误。这是我放在标记中的machinekey示例代码。只是好奇,为什么你需要手动解密应用程序中的连接字符串?只要访问
WebConfigurationManager.ConnectionStrings
就可以为您解密加密后的配置文件。这只是交给我的设计。我现在正在修改代码来实现这一点。我正在将Connectionstring从C#代码隐藏分配到ASP SQLDataSource。我尝试在代码隐藏中分配它,但仍然收到错误。我在页面加载期间为一个asp页面放置了代码以进行测试;NameOfSqlDataSource.ConnectionString=cString;您是否尝试过在.aspx页面中反向分配连接字符串?类似于
我不知道如何使用MsDeploy。不过,如果它与远程服务器有关,那么几乎不可能修改它上的任何内容。光是请求这些更改的繁文缛节就要花费比应用程序分配的时间还多的时间。那么,基本上在远程服务器上更改任何内容都是不可能的?如上所述,我将尝试在Application_Start事件中加密ConnectionString。这样,你的应用程序就可以完成加密,除此之外,你不需要其他任何东西。