再谈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 条评论
登录 后参与评论

相关文章

来自专栏

唉我好烦的呐啊

228110
来自专栏优启梦

腾讯云DNSPod域名API申请Let’s Encrypt泛域名免费SSL证书教程

Let’s Encrypt是目前使用最为广泛的免费SSL证书,蜗牛789使用的就是此款免费SSL证书,早在2017年7月份起Let’s Encrypt官方就发布...

1.9K130
来自专栏技术之路

QT5 动态链接库的创建和使用

记录一下QT5 动态链接库的创建和使用 在文章的最后有完成的代码供下载 1.创建动态链接库 先新建一个库项目 ? 选择chose进入下一下页面,类型选择共享库,...

19760
来自专栏从零开始学 Web 前端

PCI配置空间简介

现在有个难题——CF8h、CFCh端口是32位端口,可像Turbo C之类的16位C语言编译器都不支持32位端口访问。怎么办?我们可以使用**_ _ emit ...

25220
来自专栏偏前端工程师的驿站

.Net魔法堂:史上最全的ActiveX开发教程——发布篇

一、 前言                                  接着上一篇《.Net魔法堂:史上最全的ActiveX开发教程——开发篇》,本篇讲述...

26360
来自专栏码农二狗

不使用smtp直接发送邮件

25810
来自专栏LhWorld哥陪你聊算法

【Azkaban搭建】---Azkaban 3.25.0搭建细则 超实用

Azkaban是一个工作流调度工具,因为需要各个任务之间有依赖关系,传统的Crontab 任务已经不能满足。

17550
来自专栏小白安全

小白博客 Linux下暴力破解工具Hydra详解

Number one of the biggest security holes are passwords, as every password secu...

82270
来自专栏文渊之博

webconfig 文件加密处理

前几日正好遇到配置文件加密解密的问题,简单记录下流程。 1.首先运行cmd然后打开Framework。cd C:\Windows\Microsoft.NET\F...

20680
来自专栏向治洪

android 签名

(1)Android Studio菜单Build->Generate Signed APK  ? (2)弹出窗口  ? (3)创建密钥库及密钥,创...

20580

扫码关注云+社区

领取腾讯云代金券