专栏首页菩提树下的杨过再谈web.config/app.config敏感数据加/解密的二种方法

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

转载请注明来自"菩提树下的杨过"

一.利用代码加解密

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会自动处理

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

步骤: 1.先在本地生成RSA容器(有关RSA的详细操作,可参见http://msdn.microsoft.com/zh-cn/library/yxw286t2(VS.80).aspx ) aspnet_regiis.exe -pc "JimmyKeys" -exp 注:JimmyKeys为容器名字,可随便改

2.再将RSA导出到xml文件 aspnet_regiis.exe -px "JimmyKeys" "c:\JimmyKeys.xml"

3.在web.config中增加一节,一般放在<appSettings>之前就可以了,如下

<configProtectedData>
         <providers>
             <add name="JimmyRSAProvider"
                 type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                 keyContainerName="JimmyKeys"
                 useMachineContainer="true" />
 
         </providers>
     </configProtectedData>
     <appSettings>
         ...

    4.将web.config加密 aspnet_regiis.exe -pef "appSettings" "c:\website" -prov "JimmyRSAProvider"

解密: aspnet_regiis.exe -pdf "appSettings" "c:\website"

5.部署到远程服务器(1台或多台) a.将网站文件与JimmyKeys.xml(也就是导出的RSA容器文件)先上传到服务器,同时导入RSA aspnet_regiis.exe -pi "JimmyKeys" "c:\JimmyKeys.xml"

b.确认服务器上aspx登录所用的默认帐号 Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name); 随便建一个aspx,把上一行代码贴到里面就可以了,IIS5环境下输出的是ASPNET,IIS6环境下输出的是NETWORK SERVICE,IIS7下没试过也不知道输出的是啥玩意儿

c.授于RSA窗口的读取权限给b中的默认帐号 aspnet_regiis.exe -pa "JimmyKeys" "NETWORK SERVICE"

顺便把刚才这些个操作的命令整理成几个批处理

1.本机bat(新建RSA容器,导出容器,加密web.config) %windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pz "JimmyKeys" %windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pc "JimmyKeys" -exp %windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -px "JimmyKeys" "c:\JimmyKeys.xml" %windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pef "appSettings" "c:\website" -prov "JimmyRSAProvider"

2.远程服务器bat(导入RSA容器,授权) %windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pi "JimmyKeys" "c:\JimmyKeys.xml" %windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pa "JimmyKeys" "NETWORK SERVICE"

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

加密后:

<connectionStrings configProtectionProvider="JimmyRSAProvider">
   <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”。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • NIO复习(3):selector

    selector的工作原理,简单来看,就是上面这张图,Channel必须先向Selector注册(注:register的时候,可以选择关注哪些事件,比如:有新连...

    菩提树下的杨过
  • vs.net的调试小技巧之#define debug(适合新手)

    大多数情况下,vs.net中我们可以用断点来解决调试问题,但有些时候也可能手动需要输出一些信息做为调试的参考,你是否有过调试完成以后,忘记删除某条输出语句的经历...

    菩提树下的杨过
  • jboss eap 6.3 集群(cluster)配置

    接上一篇继续,Domain模式解决了统一管理多台jboss的问题,今天我们来学习如何利用mod_cluster来实现负载均衡、容错。 mod_cluster是j...

    菩提树下的杨过
  • PE格式第五讲,手工添加节表

             PE格式第五讲,手工添加节表 首先我们要用汇编编写一段汇编代码,用来生成标准PE 一丶标准PE生成的汇编代码 .386 .model fla...

    IBinary
  • AutoMapper:Unmapped members were found.

    异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 应用场景:ViewModel==>Mode...

    逸鹏
  • WannaCry勒索病毒详细解读

    2017年5月12日,WannaCry蠕虫通过MS17-010漏洞在全球范围大爆发,感染了大量的计算机,该蠕虫感染计算机后会向计算机中植入敲诈者病毒,导致电脑大...

    FB客服
  • 聊聊flink的Table API及SQL Programs

    codecraft
  • 聊聊flink的Table API及SQL Programs

    (adsbygoogle = window.adsbygoogle || []).push({});

    stys35
  • Docker编排工具Docker-compose

    喵了个咪233
  • Java架构师之路:Java程序员必看的15本书的电子版下载地址

      作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从。我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序...

    Java团长

扫码关注云+社区

领取腾讯云代金券