再谈web.config/app.config敏感数据加/解密的二种方法

 

转载请注明来自"菩提树下的杨过"-http://www.cnblogs.com/yjmyzz/archive/2008/08/22/1274395.html

1.利用代码加解密

 

using System.Web.Configuration;

    
//加密web.Config中的指定节
    private void ProtectSection(string sectionName)
    {
        Configuration config 
= WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
        ConfigurationSection section 
= config.GetSection(sectionName);
        
if (section != null && !section.SectionInformation.IsProtected)
        {
            section.SectionInformation.ProtectSection(
"DataProtectionConfigurationProvider");
            config.Save();
        }
    }

    
//解密web.Config中的指定节
    private void UnProtectSection(string sectionName)
    {
        Configuration config 
= WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
        ConfigurationSection section 
= config.GetSection(sectionName);
        
if (section != null && section.SectionInformation.IsProtected)
        {
            section.SectionInformation.UnprotectSection();
            config.Save();
        }
    }

示例:
//加密连接字符串
 protected void btnEncrypt_Click(object sender, EventArgs e)
 {
     ProtectSection(
"connectionStrings");
 }


变化:

加密前:
<connectionStrings>
  <add name="connStr" connectionString="Data Source=server;Initial Catalog=Lib;User ID=sa;password=***"
   providerName="System.Data.SqlClient" />
 </connectionStrings>

加密后:
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
  <EncryptedData>
   <CipherData>
   

<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAYzAtjjJo0km/XdUrGFh3YAQAAAACAAAAAAADZgAAqAAAABAAAAD5H0RB6uSYHCk33lo9x5VHAAAAAASAAACgAAAAEAAAALS6KNeUNySZfZ/0tpmh7YWAAQAA85NFHJH

oVx1aW5pTaFfLtTo5J9lWoBR76IYIinLiIjcTeJ4tuAstgCspZlK9NMgzyWmWbbNbb8Z8canVCUpdKF0xmTBTpVih08TtODLszcUpCsJGvEgxuDPi6JtKjG/nT+UvpRp154TNnm04LP/iq1InDxePW2tEViHIiooEXARX8FLY00R

FBaUgarrfi5Fppu4usqavdnj7oqwFEbp3MXOaWY6m9qyVzNsf2G1UwBrivsrM4hZUcr1hy/S87co63ioWie8QDVgGuaTEaSyklC9STyvRsLU6A/QxalCHY4VoRjzNS/27vGoin+c3AJ587wMKJyJBiV08DyzoGM7elAlg8yTAeHv

VMLOEFcTUwsCG0f2rwhi3fZYUyykczYsfHXLEXdbJ+YRiBxYWP6xzffIdyWzrawxaIfnPq/pw6e2Vrwt6tJthDImu0tzXdwupbJVdy4T5vQvy4Fw3SB9lmbSZQacekaXcViBdX7Tejx7TTpDs36RdAOf8WcVMJH4FFAAAACjQFCa

OcSfbD2LXX4YP506vHDXw</CipherValue>
   </CipherData>
  </EncryptedData>
 </connectionStrings>

注意:
加密后,仍然可以按以前的操作来读取,不需要额外的解决操作,因为
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
这里已经指定了用何种方式解密,asp.net会自动处理

 

2.利用aspnet_regiis.exe工具加解密

 

先创建RSA容器:

%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pc "JimmyKeys"  -exp

注:上面的JimmyKeys为容器名,可随便取

为了方便在多台机器上部署config加密文件(比如服务器镜象情况),可将容器导出到xml文件

%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -px "JimmyKeys"  "d:\document\rsa\rsa.xml" -pri

删除容器命令

%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pz "JimmyKeys"  -exp

导出后,当然还可以将其导回:
%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pi "JimmyKeys" "d:\document\rsa\rsa.xml"

 

有关RSA的详细操作,可参见http://msdn.microsoft.com/zh-cn/library/yxw286t2(VS.80).aspx

 

现在可以正式加密/解密了


加密:
aspnet_regiis.exe -pef "connectionStrings" "D:\website\abc.com\"

解密:
aspnet_regiis.exe -pdf "connectionStrings" "D:\website\abc.com\"


 

加密前:
 <connectionStrings>
  <add name="connStr" connectionString="Data Source=server;Initial Catalog=Lib;User ID=sa;password=***"
   providerName="System.Data.SqlClient" />
 </connectionStrings>

加密后:
<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
  <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#">
     <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
     <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
      <KeyName>Rsa Key</KeyName>
     </KeyInfo>
     <CipherData>
     

<CipherValue>breSi2wD4X4CAKh0puzhYtyltmR3cp9JfEE8Yw03NeWGZCOoEvDuxAceKLEsmYx8r/tI5NsZxOmY20pQzD1KvGELzz4rhkEPE9LKTAwyKNhqzMPFoRnjsdGTvs6JhrvVat9rdvgKbfTvVLXuvpXgSeNB0T6XJWq

/vOIU7KTyFjk=</CipherValue>
     </CipherData>
    </EncryptedKey>
   </KeyInfo>
   <CipherData>
   

<CipherValue>c4HD+EfJl//pv4eEzT938aWYhLyPBUt8lbNWf4Y4c6tewWLNBTwgYXtxPh6TnF8ne6s9H5C/AwXy/3JECuNEd8YGOO+RDhxw8NySd8vUc53+iUiHW5TLs/aoIvy8k1yOfLWGKFFWPtoX4F4gMTS+MAmhkiHQ46p

H2VyjyprNsl8LE2pGNjDOJnDeGYq+wkn2iw968+qjuTCibGJn6h6iGYGHYmkYUrgRzfo3iIZu+eCWE2IqCP+s58eQRjU3MxJ2BqeUU9HaKy4=</CipherValue>
   </CipherData>
  </EncryptedData>
 </connectionStrings>

同样,这种方式加密后,aspx读取节点时也无需任何解密处理,代码不用做任何修改


注意:并不是所有的节点都能加密,ASP.NET 2.0仅支持对Web.config的部分配置节进行加密,以下配置节中的数据是不能进行加密的:
• <processModel>
• <runtime>
• <mscorlib>
• <startup>
• <system.runtime.remoting>
• <configProtectedData>
• <satelliteassemblies>
• <cryptographySettings>
• <cryptoNameMapping>
• <cryptoClasses>


另外,除了AppSettings和ConnectionStrings以外的其它节点,可以这样写:
aspnet_regiis.exe -pef "system.serviceModel/behaviors" "d:\website\cntvs\"

即对<system.serviceModel>下的<behaviors>节点加密,这一节点同样适用于代码方式加密,经过多次尝试,似乎除了AppSettings和ConnectionStrings以外的其它节点,只能支持二级节点。

象以下写法:
aspnet_regiis.exe -pef "system.serviceModel/behaviors/endpointBehaviors" "d:\website\cntvs" 
运行时会报错:

未找到配置节“system.serviceModel/behaviors/endpointBehaviors”。

posted @ 2008-08-26 16:12  没事逛大街  阅读(255)  评论(0编辑  收藏  举报