前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >再谈web.config/app.config敏感数据加/解密的二种方法

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

作者头像
菩提树下的杨过
发布2018-01-24 14:51:32
2K0
发布2018-01-24 14:51:32
举报
文章被收录于专栏:菩提树下的杨过

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

一.利用代码加解密

代码语言:js
复制
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();
         }
     }
 

示例:

代码语言:js
复制
//加密连接字符串
  protected void btnEncrypt_Click(object sender, EventArgs e)
  {
      ProtectSection("connectionStrings");
  }
 

变化: 加密前:

代码语言:js
复制
 <connectionStrings>
   <add name="connStr" connectionString="Data Source=server;Initial Catalog=Lib;User ID=sa;password=***"
    providerName="System.Data.SqlClient" />
  </connectionStrings>
 

加密后:

代码语言:js
复制
 <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>之前就可以了,如下

代码语言:js
复制
<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>

加密后:

代码语言:js
复制
<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”。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2008-08-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档