首页 文章

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

提问于
浏览
15

我试图在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

    实际上你可以使用微软的EL来实现加密你的连接字符串 . 你可以在这里下载:http://www.codeplex.com/entlib

    心连心

  • 7

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

  • 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

  • 1

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

    根据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复制到第二台服务器

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

    根据您提到的步骤,我认为您遵循的大部分流程应该是正确的 . 到目前为止,我建议您检查以下内容:

    • 检查自定义RSA提供程序设置,以查看它是否也正确复制到目标计算机并设置为使用计算机容器

    ========加密配置部分=======

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

    • AS在上述步骤中,创建RSA密钥容器后,需要使用"aspnet_regiis -pa"来确保某个帐户(将运行您的ASP.NET应用程序)具有对密钥容器的足够访问权限 . 通常,当您使用VS 2008 / VS 2005测试服务器运行ASP.NET应用程序时,您使用的是登录用户(可能是管理员),但是,如果您在IIS中运行ASP.NET(或者在移动到其他服务器使用另一个不同的进程帐户),您需要确保已授予某个进程帐户权限 .

    您可以检查它们以查看问题是否是由于其中一些问题造成的 .

    真诚的,Sanjay Manju suman

  • 0

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

    • configProtectedData 中添加 RemoveClear 标签 .

    • 验证导出密钥时使用了 –pri

    • 还要确保keyContainerName与用于regstering的keyContainerName相同

    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>
    

    REFERENCE

  • 0

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

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

    有关信息,请关注此链接,这可能是一个有用的....

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

  • 1

    这是加密和解密连接字符串的另一种方法,如果您使用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();
        }
    }
    

相关问题