在将ASP.NET项目部署到服务器上时,内网环境下Web.Config往往是直接复制过去。对于外网环境,则需要对Web.Config文件进行加密。

.NET环境下一共提供了2种方式的加密功能,分别是DpapiProtectedConfigurationProvider和RsaProtectedConfigurationProvider提供程序。

前者在本机加密Web.Config后,只能在本机进行解密,如果需要将Config文件复制到外部主机,则无法进行解密。后者在本机加密Config文件后,可以到处密钥容器,当把Config文件复制到外部主机后,可对先前导出的文件进行导入功能,导入后既可自动解密。

由于经常需要复制Config文件到外部主机,因此Rsa保护程序更加适用于实际业务场景,本文将详细介绍RsaProtectedConfigurationProvider程序的使用步骤。

1. 使用RsaProvider提供程序,需要首先进入.NET Framework运行环境,可以配置环境变量或使用cd指令。

cd  C:\Windows\Microsoft.NET\Framework\v2.0.50727

2. 接着便可以使用aspnet_regiis.exe创建一个Rsa密钥容器。密钥容器分用户级别和计算机级别两种情况,由于使用用户级别密钥没什么益处,一般使用计算机级别既可。

aspnet_regiis -pc "MyKeys" -exp

3. 创建密钥容器后,还需要设置密钥容器的访问权限,下面的命令授予NETWORK SERVICE 帐户对计算机级别的 “MyKeys” RSA 密钥容器的访问权限。msdn上有一个aspx程序会展示你的asp.net程序的用户标志,不过本人实际执行pa指令后会报错。

aspnet_regiis -pa "MyKeys" "NT AUTHORITY\NETWORK SERVICE"

4. 在Web.Config文件中加上如下配置节点,MyProvider为你的保护程序名称,可随意指定。keyContainerName为前面设置的密钥容器名称,useMachineContainer为true表示使用计算机级别密钥,为false表示使用使用用户级密钥。

这段配置节不要像msdn那样直接放在configure配置节点下面,这样会报错,建议放在你需要加密节点的后面。

   <configProtectedData>
<providers>
<add name="MyProvider"
type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,
processorArchitecture=MSIL"
keyContainerName="MyKeys"
useMachineContainer="true" />
</providers>
</configProtectedData>

5 .下面的指令将对指定路径下的config文件节点进行加密,如果配置文件中还有session的sql连接字符串,也可以对sessionState节点进行加密。

aspnet_regiis -pef "connectionStrings"  "D:\WebApp"  -prov   "MyProvider"

aspnet_regiis -pef "system.web/sessionState"  "D:\WebApp"  -prov   "MyProvider"

加密后的connectionStrings节点如下所示,此时仍可访问ASP.NET应用程序。

  <connectionStrings configProtectionProvider="MyProvider">
<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>X3XoBfbo/h9QUeVUV8A1EGMM0NQuBnhfuC/iV1e7CCmGaiRt9ogmICenTK8VAmGfhufPzWFu5UUHSiO/6BIvYPEO5WoWlj3h5/sUQmRj6NsAJOnrnYHEjta4oQb4XajxazWcf3HUeWR0mG4wDCiUfTZaRIRmXkGgfbxewpsKJ5k=</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>suqFgGjGFaon62YNI2VM5SQymcf4yyAku9fWQuvgClj1bfqixK9kIs9IE0I0m2u4gLbF+y0xPharfcOFJpXHDwHoaCrNQsxsutqiXquX67bYcJeYaMz5ja9ebqAtQvKIiZ/kHGvFIPXSCg5HiW/GGQwaf3FESVEsOaSAJZ3JJk9MlkkwDd6LepgtcCVjLnEK0lOeEFznrngizFFZWAsYjh5UCF5lNxNxf/IBwtznsfiFi2tV1F4sx9HkJEEryf5MEtu1RAA/wqarMvn7dlXhpGconpNPXA1IGlTmaZ/S1bR/FsO39skgHrs+OHsDMbJrI5ZO4TXXbK/DD86GPzu9JXrVKNVImzzW0V8aMc2HcVNClPsMwwgGaH6PNhE0xkjV6YH77XcLdVsKibvnwMlO/4kjGKoNXaSkFBoAEgprzi8=</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>

如果需要解密,可以执行下面这条指令aspnet_regiis -pdf "connectionStrings" "D:\WebApp"

<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-WebApp-20170622060005.mdf;Initial Catalog=aspnet-WebApp-20170622060005;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>

6. 导出密钥容器,密钥信息将被存储在导出的xml文件中,pri表示将公钥和私钥一起导出。

aspnet_regiis  -px "MyKeys" "D:/MyKeys.xml"  -pri

7.  有了这个xml文件,就相当于有了密钥容器,导出密钥容器后可以对密钥容器进行删除,删除指令如下。

aspnet_regiis  -pz  "MyKeys"

8. 删除密钥容器后,如果前面你没有对Config文件进行解密,那么运行ASP.NET程序将会直接报错。

在本人实际操作中发现,如果对正在运行的ASP.NET应用程序的Web.Config文件进行加密,加密后立即删除密钥,此时点击运行(不调试)仍可正常访问。这表明Rsa解密操作在内存中执行,只有重新生成解决方案或调试(会执行生成操作)后,访问才会报错。

9. 现在可以将加密后的config文件和导出的MyKeys.xml一起复制到服务器上,此时运行网站将会直接报错,需执行下面的导入指令。

aspnet_regiis -pi "MyKeys"  "D:/MyKeys.xml"

导入后,在本机访问ASP.NET网站会发现仍然报错,提示无法open  Provider。这个坑最终在网上找到解决方法,如下面指令所示,需要为应用程序池设置对密钥容器的访问权限。

aspnet_regiis -pa "MyKeys"   "IIS APPPOOL\MyWeb" -full

自此整个流程已结束,可以将上面这些指令封装成2个批处理程序,一个是密钥制作bat,一个是导入bat,如下所示。

@echo on
cd C:\Windows\Microsoft.NET\Framework\v2.. ::设置config地址,config文件要在E:\test下面
set configAddress="E:\test" ::创建RSA密钥容器
aspnet_regiis -pc "MyKeys" -exp ::设置密钥容器访问权限
aspnet_regiis -pa "MyKeys" "NT AUTHORITY\NETWORK SERVICE" ::加密
aspnet_regiis -pef "connectionStrings" "D:\WebApp" -prov "MyProvider" aspnet_regiis -pef "system.web/sessionState" "D:\WebApp" -prov "MyProvider" ::导出
aspnet_regiis -px "MyKeys" "D:/MyKeys.xml" -pri ::删除密钥容器
aspnet_regiis -pz "MyKeys" pause
@echo on
cd C:\Windows\Microsoft.NET\Framework\v2.0.50727 ::删除旧的密钥容器
aspnet_regiis -pz "MyKeys" ::导入新的密钥容器
aspnet_regiis -pi "MyKeys" "D:/MyKeys.xml" ::设置应用程序池的访问权限
aspnet_regiis -pa "MyKeys" "IIS APPPOOL\MyWeb" -full pause

在写完这2个bat后,我想起前面的解密指令aspnet_regiis -pdf "connectionStrings" "D:\WebApp",它只需要提供节点名称和路径。也就是说,如果攻击者能够在被攻击的服务器上执行cmd指令,那么他就可以对config进行解密。这个问题如有前辈有更好的解决方式,欢迎您指导留言。

如果当初微软编写这个指令解析方法时,加上一个key的参数。那么即使攻击者能够执行cmd指令,由于不知道key的名称,所以仍然无法对config进行解密。

声明:本文原创发表于博客园,作者为方小白 ,如有错误欢迎指出。本文未经作者许可不许转载,否则视为侵权。

C#基础之.NET环境下WebConfig的加密的更多相关文章

  1. C#基础:.NET环境下WebConfig的加密

    在将ASP.NET项目部署到服务器上时,内网环境下Web.Config往往是直接复制过去.对于外网环境,则需要对Web.Config文件进行加密. .NET环境下一共提供了2种方式的加密功能,分别是D ...

  2. linux环境下给文件加密/解密的方法

      原文地址:linix环境下给文件加密/解密的方法 作者:oracunix 一. 利用 vim/vi 加密:优点:加密后,如果不知道密码,就看不到明文,包括root用户也看不了:缺点:很明显让别人知 ...

  3. Java 环境下使用 AES 加密的特殊问题处理

    在 Java 环境下使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊的处理. 1. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 ...

  4. php大力力 [003节]php在百度文库的几个基础教程mac环境下文本编辑工具

    2015-08-22 php大力力003.mac环境下文本编辑工具 在windows下,使用notepad特别多.在mac下使用“备忘录”app,word,反而没有存储过txt后缀等不同文本. mac ...

  5. Linux基础:Linux环境下安装JDK

    title: Linux基础:JDK的及环境变量配置 author: Enjoyitlife.top date: 2019-10-09 20:50:36 tags: Linux JDK categor ...

  6. .NET环境下的DPAPI加密编程

    Windows的本地加密保护机制提供了简单的调用接口,密钥的生成.保护等事项一概由系统来处理,其编程接口称为DPAPI.这一加密保护机制的边界是用户登录帐户或者本地计算机系统,使用操作系统设定的加密处 ...

  7. Dynamics CRM2015 非基础语言环境下产品无法新建的问题

    该现象出现在2015版本上,之前从没注意过这个问题不知道以前的版本是否存在. 我的安装包的基础语言是中文,第一张图有添加产品的按钮,切换到英文环境下后就没有了,一开始以为是系统做了隐藏处理,但用工具查 ...

  8. spring Boot环境下dubbo+zookeeper的一个基础讲解与示例

    一,学习背景 1.   前言 对于我们不管工作还是生活中,需要或者想去学习一些东西的时候,大致都考虑几点: a)      我们为什么需要学习这个东西? b)     这个东西是什么? c)      ...

  9. iptables 生产环境下基础设置

    iptables 生产环境下基础设置 生成环境需求:防火墙需要让内网的Ip全部通过,外网IP添加到白名单,其他一切拒绝.安装在linux系统中安装yum install iptables-servic ...

随机推荐

  1. 稳聘App设计图分享

    摘要||潜心学习,无限开源,我是鸟窝,一只憨厚的鸟,联系我加微信:jkxx123321 很早期就想筹划上线一款招聘类App,一拖再拖,先做还没有上线. 下面的设计原图,为我UI徒弟所做,在此,表示万分 ...

  2. [Android] Service服务详解以及如何使service服务不被杀死

    排版上的细节有些不好看,主要是我用的MarkDown编辑器预览和这里的不一样,在那个上面的样式很舒服.这里要改的地方太多就不想改了,将就看吧.下次写的时候注意.还有看到错误给我提啊. 本文链接:htt ...

  3. springboot 1.3.5升级1.5.9后 默认使用tomcat 8.5版本 get请求报400 异常信息为 The valid characters are defined in RFC 7230 and RFC 3986

    1.springboot 1.3.5升级1.5.9后 默认使用tomcat 8.5版本而之前用的是tomcat7    get请求报400 异常信息为 The valid characters are ...

  4. 监控文件内容变化,即时写入到新文件(tail)

    监控文件a,如有新内容写入,即时将新内容写入到新文件aa中: fw=open('e:\\aa.txt','ab') with open('e:\\a.txt','rb') as fo: while T ...

  5. grep 匹配制表符 和 换行符

    使用: [root@dhcp-- ~]# grep $'\n' log.txt [root@dhcp-- ~]# grep $'\t' log.txt 这两个命令 [root@dhcp-- ~]# l ...

  6. Python实例--12306的抢票功能

    基础知识学习 目标: 通过python程序实现自动登录下单功能 知识点: Selenium + 云打码 + Python 学习链接: 1. Python学习--Selenium模块 2. Python ...

  7. ORACLE 查看并修改最大连接数

    第一步,在cmd命令行,输入sqlplus,打开登录窗口,如下: 第二步,根据提示输入用户名与密码 请输入用户名:sys as sysdba 输入口令:******** 第三步,查看processes ...

  8. linux 下获取文件最后几行

    在Linux下,获取文件倒数几行的命令是: tail -n 10 your_filename     #获取倒数10行

  9. sql点滴45—mysql中group_concat用法

    group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果.比较抽象,难以理解. 通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组, ...

  10. 小程序push数组,渲染不出来解决办法

    1.在data中,定义一个空数组: zhou_time:[] 2.声明: var zhou_time = this.data.zhou_time; 3.PUSH赋值: zhou_time.push({ ...