使用RsaProtectedConfigurationProvider进行Web.Config加密 - “错误数据”错误

时间:2009-04-23 13:24:28

标签: asp.net encryption rsa

我正在尝试按照procedure described on MSDN加密ASP.NET 2.0 Web应用程序的Web.Config文件中的连接字符串值。使用RsaProtectedConfigurationProvider,我在我的开发机器上创建并导出了一个机器级密钥(使用-pri标志),并在Web服务器上导入密钥和授予访问权限。在通过ASP.NET测试自动解密之前,我想尝试手动解密Web.Config。

我能够分别使用-pef和-pdf参数在同一台机器上手动加密和解密Web.Config,但在Web服务器上手动解密失败并显示Bad Data错误消息。

最奇怪的是我的Web.Config文件中的keyContainerName属性似乎被忽略了。如果我尝试用乱码替换正确的值(不再对应于我创建的任何密钥容器),加密和解密仍然可以在我的开发机器上运行。有什么想法吗?

7 个答案:

答案 0 :(得分:7)

根据您的描述,您遇到了一些关于加密的问题 web.config通过可导出的RSA提供程序,对吗?

根据RSA加密参考,我已经进行了一些本地测试, 通过RSA提供程序加密web.config部分的正常过程 移动到其他机器如下:

====================== 第1步

创建机器级RSA密钥容器: aspnet_regiis -pc“MyTestKeys”-exp

第2步

授予对RSA加密密钥的读取权限:

aspnet_regiis -pa“MyTestKeys”“NT AUTHORITY \ NETWORK SERVICE”

第3步

加密配置文件: aspnet_regiis -pef“connectionStrings”“网站的物理路径 文件夹“-prov MyRSAProvider

导出容器并使用它将其导回到其他机器 以下步骤

第4步

导出机器级RSA密钥容器: aspnet_regiis -px“MyTestKeys”“c:\ Config-Key.xml”-pri

第5步

将Config-Key.xml复制到第二台服务器上的c:\

第6步

在第二台服务器上导入计算机级RSA密钥容器: aspnet_regiis -pi“MyTestKeys”“c:\ Config-Key.xml”

第7步

授予对RSA加密密钥的读取权限: aspnet_regiis -pa“MyTestKeys”“NT AUTHORITY \ NETWORK SERVICE”

第8步

将加密的web.config复制到第二台服务器

========================

根据您提到的步骤,我认为您已经完成了大部分流程 其次应该是正确的。到目前为止,我建议你检查一下 以下事项:

  1. 检查自定义RSA提供程序设置以查看其是否正确 也复制到目标计算机并设置为使用机器容器
  2. ========加密配置部分=======            

    型=“System.Configuration.RsaProtectedConfigurationProvider,System.Configur ation,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a“/>     

    1. AS在上述步骤中,创建RSA密钥容器后,您需要 使用“aspnet_regiis -pa”来确保某个帐户(将会 运行您的ASP.NET应用程序)具有足够的访问权限 钥匙容器。通常,当您使用VS 2008 / VS 2005测试服务器运行时 ASP.NET应用程序,您正在使用登录用户(可能是 但是,如果您在IIS中运行ASP.NET(或移动到其他之后) 您正在使用另一个不同的进程帐户的服务器) 确保某个进程帐户已被授予权限。
    2. 您可以检查它们以查看问题是否是由于其中一些问题造成的。

      此致 Sanjay Manju suman

答案 1 :(得分:1)

请注意要加密的元素的名称区分大小写。 所以你应该使用“connectionStrings”而不是“connectionstrings”或“ConnectionStrings”。

答案 2 :(得分:1)

当我手动解密时出现Bad Data错误时,我按照下面列出的方法进行操作。

  1. Remove。{/ li>中添加ClearconfigProtectedData代码
  2. 导出密钥
  3. 时验证–pri
  4. 还要确保keyContainerName与用于注册
  5. 的密钥相同
      

    keyContainerName =" MyKeys"

    <强> CONFIG

    <configProtectedData>
      <providers>
    
        <clear/>
    
    <remove name="RSAProtectedConfigurationProvider" />
    
         <add name="RSAProtectedConfigurationProvider" keyContainerName="MyKeys" 
        type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,&#xD;&#xA;                
    Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,&#xD;&#xA; processorArchitecture=MSIL"
              useMachineContainer="true" />
    
      </providers>
    </configProtectedData>
    

    <强>参考

    1. ConnectionString Encryption
    2. Where is RAS Key...

答案 3 :(得分:0)

实际上,您可以使用Microsoft的EL来加密您的连接字符串。您可以在此处下载:http://www.codeplex.com/entlib

HTH

答案 4 :(得分:0)

RsaProtectedConfigurationProvider使用计算机帐户或用户帐户加密密钥并将其保存在名为“密钥容器”的文件中,该文件通常保存在C:\ Documents and Settings \ All Users \ Application Data \ Microsoft \ Crypto中\ RSA。并且ASP.NET工作进程标识(XP / 2000中的ASPNET用户或2003年的网络服务)应该可以访问这些文件以便能够解密它,否则您将收到此错误消息。

请查看此链接以获取更多信息

http://msdn.microsoft.com/en-us/library/dtkwfdky.aspx

答案 5 :(得分:0)

如马赫迪所说,加密非常区分大小写。我已经在我的电脑中使用并将它带到服务器我遇到了问题,问题来自存储在我的PC文件夹或目录中的RSA机器密钥容器。如果您想在进行任何更改之前知道可以开始更正的位置,请从

开始
\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys.

有关信息,请关注此链接,这可能会有所帮助......

http://msdn.microsoft.com/en-us/library/ms998283.aspx

答案 6 :(得分:0)

这是加密和解密连接字符串检查它的另一种方法 如果你使用的是vs2010,那么以管理员身份运行

打开vs2010
string provider = "RSAProtectedConfigurationProvider";

string section = "connectionStrings"; 

protected void btnEncrypt_Click(object sender, EventArgs e) 

{

   Configuration confg =
   WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

   ConfigurationSection configSect = confg.GetSection(section);

   if (configSect != null)

   {
      configSect.SectionInformation.ProtectSection(provider);
      confg.Save();

   }

}
protected void btnDecrypt_Click(object sender, EventArgs e)
{
    Configuration config =
        WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
    ConfigurationSection configSect = config.GetSection(section);
    if (configSect.SectionInformation.IsProtected)
    {
        configSect.SectionInformation.UnprotectSection();
        config.Save();
    }
}