C#基础之.NET环境下WebConfig的加密
在将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的加密的更多相关文章
- C#基础:.NET环境下WebConfig的加密
在将ASP.NET项目部署到服务器上时,内网环境下Web.Config往往是直接复制过去.对于外网环境,则需要对Web.Config文件进行加密. .NET环境下一共提供了2种方式的加密功能,分别是D ...
- linux环境下给文件加密/解密的方法
原文地址:linix环境下给文件加密/解密的方法 作者:oracunix 一. 利用 vim/vi 加密:优点:加密后,如果不知道密码,就看不到明文,包括root用户也看不了:缺点:很明显让别人知 ...
- Java 环境下使用 AES 加密的特殊问题处理
在 Java 环境下使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊的处理. 1. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 ...
- php大力力 [003节]php在百度文库的几个基础教程mac环境下文本编辑工具
2015-08-22 php大力力003.mac环境下文本编辑工具 在windows下,使用notepad特别多.在mac下使用“备忘录”app,word,反而没有存储过txt后缀等不同文本. mac ...
- Linux基础:Linux环境下安装JDK
title: Linux基础:JDK的及环境变量配置 author: Enjoyitlife.top date: 2019-10-09 20:50:36 tags: Linux JDK categor ...
- .NET环境下的DPAPI加密编程
Windows的本地加密保护机制提供了简单的调用接口,密钥的生成.保护等事项一概由系统来处理,其编程接口称为DPAPI.这一加密保护机制的边界是用户登录帐户或者本地计算机系统,使用操作系统设定的加密处 ...
- Dynamics CRM2015 非基础语言环境下产品无法新建的问题
该现象出现在2015版本上,之前从没注意过这个问题不知道以前的版本是否存在. 我的安装包的基础语言是中文,第一张图有添加产品的按钮,切换到英文环境下后就没有了,一开始以为是系统做了隐藏处理,但用工具查 ...
- spring Boot环境下dubbo+zookeeper的一个基础讲解与示例
一,学习背景 1. 前言 对于我们不管工作还是生活中,需要或者想去学习一些东西的时候,大致都考虑几点: a) 我们为什么需要学习这个东西? b) 这个东西是什么? c) ...
- iptables 生产环境下基础设置
iptables 生产环境下基础设置 生成环境需求:防火墙需要让内网的Ip全部通过,外网IP添加到白名单,其他一切拒绝.安装在linux系统中安装yum install iptables-servic ...
随机推荐
- jQuery获取json数据
出自---小瓶子编辑 $.each()方法接受两个参数,第一个是需要遍历的对象集合(JSON对象集合),第二个是用来遍历的方法,这个方法又接受两个参数,第一个是遍历的index,第二个是当前遍历的值. ...
- c#经典算法之冒泡排序(Bubble Sort)
转载于:https://www.cnblogs.com/shen-hua/p/5422676.html 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面, ...
- jquery中ajax的dataType的各种属性含义
参考ajax api文档:http://www.w3school.com.cn/jquery/ajax_ajax.asp dateType后接受的参数参数类型:string 预期服务器返回的数据类型. ...
- Android的.so文件、ABI和CPU的关系
Android的.so文件.ABI和CPU的关系有篇文章描述的很详细了 见 http://blog.csdn.net/xx326664162/article/details/51163905
- Go 在 TiDB 的实践
https://blog.csdn.net/RA681t58CJxsgCkJ31/article/details/79215751 更多TiDB链接: https://my.oschina.net/z ...
- Hadoop HBase概念学习系列之META表和ROOT表(六)
在 HBase里的HRegion 里,谈过,HRegion是按照表名+开始/结束主键,即表名+主键范围来区分的.由于主键范围是连续的,所以一般用开始主键就可以表示相应的HRegion了. 不过,因为我 ...
- [2018HN省队集训D9T1] circle
[2018HN省队集训D9T1] circle 题意 给定一个 \(n\) 个点的竞赛图并在其中钦定了 \(k\) 个点, 数据保证删去钦定的 \(k\) 个点后这个图没有环. 问在不删去钦定的这 \ ...
- Post-installation steps for Chromium | Fedora
Flash 插件安装 网址: https://fedora.pkgs.org/ 下载: chromium-pepper-flash-version.fc28.x86_64.rpm 安装后重启浏览器 解 ...
- 自带hyper -v 或者 Vmware安装Linux centos
centos系统存在网盘,链接: https://pan.baidu.com/s/1A5ywyLjIegcftaT_xCvPbA 密码: n6v4 https://blog.csdn.net/nanc ...
- (十九)ArcGIS JS 加载WMS服务(超图示例)
前言 在工作中,需要在ArcGIS API for JavaScript中加载超图服务,因为超图的rest服务只可以用于Leaflet .openlayers3 (with MVT) .MapboxG ...