加密webconfig中的连接字符串,利用RSA非对称加密,利用windows保存密钥容器

时间:2021-11-13 03:17:18

简单的解决方法:

WebConfig 加解密,未能使用提供程序“RsaProtectedConfigurationProvider”进行解密。提供程序返回错误消息为: 打不开 RSA 密钥容器。
问题:未添加用于访问 RSA 密钥容器
命令:aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY/NETWORK SERVICE"
注意事项:XP下:aspnet_regiis -pa "NetFrameworkConfigurationKey" "aspnet"
加密:aspnet_regiis -pe "appSettings" -app "/应用程序名"
解密:aspnet_regiis -pd "appSettings" -app "/应用程序名"  如(/PetShop/web)

更灵活的解决方法:
1、创建一个密钥容器 
   aspnet_regiis -pc "ConnectionStringsKey" -exp
   ConnectionStringsKey为密钥容器的名称 
   可以使用aspnet_regiis /?查看该命令的用法

2、在web.config中加入如下内容

[c-sharp]

<configProtectedData>   

        <providers>   

            <clear />   

            <add name="ConnectionStringsKeyProvider"  

        type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"   

        keyContainerName="ConnectionStringsKey"   

        useMachineContainer="true"/>   

        </providers>   

</configProtectedData>  


3、通过命令行:用指定的密钥加密指定目录下的web.config文件的指定的配置节
     aspnet_regiis -pef "connectionStrings" "d:/testproj/websitetest" -prov "ConnectionStringsKeyProvider"
    对于子配置节用/分隔表示, 如identity配置节 需要写成 "system.web/identity"
4、如果访问web程序,页面提示 Error message from the provider: The RSA key Container could not be opened.
     是由于network service帐户无法访问密钥文件造成的。 找到密钥文件, 赋予network service读权限。该密钥文件位于(可按时间排序,找到自己产生的那个密钥文件)
vista: c:/ProgramData/Microsoft/Crypto/RSA/MachineKeys/
xp或其他:C:/Documents and Settings/All Users/Application Data/Microsoft/Crypto/RSA/MachineKeys

至此:查看被加密的标记, 内容就已经是被加密过的了。

5.通过.aspx页面:加密连接字符串:界面如图:

加密webconfig中的连接字符串,利用RSA非对称加密,利用windows保存密钥容器

后台代码:

[c-sharp]

//加密按钮  

protected void Button1_Click(object sender, EventArgs e)   

{   

   //①需要加密的节点:   

    string name = @"connectionStrings";   

   //②当前路径;   

    string appPath = "/loginContral";   

    Configuration config = WebConfigurationManager.OpenWebConfiguration(appPath);   

    //③提供加密的方式:(这里使用自定义的加密方式)   

    // string provider = "RsaProtectConfigurationProvider";   

    string provider = "ConnectionStringsKeyProvider";    

    config.GetSection(name).SectionInformation.ProtectSection(provider);   

  

    //⑤保存web.config文件   

    try   

    {   

        config.Save();   

    }   

    catch (Exception ex)   

    {   

        Response.Write(ex.Message);   

    }   

    if (config.GetSection(name).SectionInformation.IsProtected)   

    {   

        Button1.Enabled = false;   

        Response.Write("加密成功!");   

    }   

    else   

    {   

        Response.Write("加密失败!");   

    }   

}  

  

//解密按钮:  

  

protected void Button2_Click(object sender, EventArgs e)   

{   

     //①需要节密的节点:   

     string name = @"connectionStrings";   

  

    //②当前路径;   

     string appPath = "/loginContral";   

     Configuration config = WebConfigurationManager.OpenWebConfiguration(appPath);   

  

    //③使用UnprotectSection方法进行解密;        

  

     config.GetSection(name).SectionInformation.UnprotectSection();   

  

     //④保存web.config文件        

     config.Save();   

  

     if (config.GetSection(name).SectionInformation.IsProtected==false)   

     {   

         Button2.Enabled = false;   

         Response.Write("解密成功!");   

     }   

     else   

     {   

         Response.Write("解密失败!");   

     }   

}  

注意:string appPath = "/loginContral" 为当前项目路径;

加密前的连接字符串:

[c-sharp]

<connectionStrings>  

    <add name="connection" connectionString="data source=.;database=aspnetdb;user id=sa;pwd=123;" />  

</connectionStrings>  


加密后的连接字符串:

[c-sharp]

<connectionStrings configProtectionProvider="ConnectionStringsKeyProvider">  

       <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"  

           xmlns="http://www.w3.org/2001/04/xmlenc#">  

           <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />  

           <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">  

               <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">