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.0.50727

::设置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进行解密。

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

时间: 2024-10-12 03:56:04

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

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

该现象出如今2015版本号上,之前从没注意过这个问题不知道曾经的版本号是否存在. 我的安装包的基础语言是中文.第一张图有加入产品的button,切换到英文环境下后就没有了,一開始以为是系统做了隐藏处理.但用工具查看home列表却发现没那3个button,那我们仅仅能手工加了. 在home列表加入自己定义button,然后分别加入Action和EnableRule,这个地方之所以用EnableRule是由于我们要用到CustomRule在js脚本中用代码进行控制(其它的displayrule和en

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

在 Java 环境下使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊的处理. 1. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 Invalid AES key length 你需要下载一个支持更长密钥的包.这个包叫做 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6,可以从这里下载,下载地址:http://www.

Dynamics CRM2015 非基础语言环境下产品无法新建的问题的解决方法

该现象出现在2015版本上,之前从没注意过这个问题不知道以前的版本是否存在. 我的安装包的基础语言是中文,第一张图有添加产品的按钮,切换到英文环境下后就没有了,一开始以为是系统做了隐藏处理,但用工具查看home列表却发现没那3个按钮,那我们只能手工加了. 在home列表添加自定义按钮,然后分别添加Action和EnableRule,这个地方之所以用EnableRule是因为我们要用到CustomRule在js脚本中用代码进行控制(其他的displayrule和enablerule做不到这点),然

Linux环境下使用同态加密库HElib

HElib库是在NTL库的基础上编写的,所以要顺利使用HElib库就得先编译NTL库: http://www.shoup.net/ntl/-- NTL库的链接 https://github.com/shaih/HElib-- HElib库的链接 1. 编译NTL库 1)进入http://www.shoup.net/ntl/.依次点击A Tour of NTL->Obtaining and Installing NTL for UNIX.默认按照第一种方式编译: % gunzip ntl-xxx.

java基础 - linux环境下编辑简易JAVA程序

在LINUX下 编辑编译 乘法表 打印出来 (JAVA基础练习) [[email protected] chengxu]# vi test.java public class test{         public static void main (String args[]){ for(int i=0;i<10;i++){ for(int j =1;j<=i;j++){                                 System.out.print(j+"*&

.NET环境下的DPAPI加密编程

Windows的本地加密保护机制提供了简单的调用接口,密钥的生成.保护等事项一概由系统来处理,其编程接口称为DPAPI.这一加密保护机制的边界是用户登录帐户或者本地计算机系统,使用操作系统设定的加密处理过程保护数据和解密还原数据,用户无需关心密钥的来源和管理.使用 DPAPI加密本地敏感信息可以使应用程序免于处理生成和存储加密密钥这一难题. 在保护边界之外,DPAPI加密的保护的机制与强度与EFS类似.较EFS的差异是,同一用户帐户或者计算机保护范围之内,还可以使用可选乱数建立更细粒度的加密分割

android环境下两种md5加密方式

在平时开发过程中,MD5加密是一个比较常用的算法,最常见的使用场景就是在帐号注册时,用户输入的密码经md5加密后,传输至服务器保存起来.虽然md5加密经常用,但是md5的加密原理我还真说不上来,对md5的认知目前仅仅停留在会使用的水平,想搞清楚还是要花点时间的,这是md5加密算法的相关介绍.本文主要介绍android平台下两种md5加密方式,分别为基于java语言的md5加密及ndk环境下基于c语言的md5加密. 下面代码为基于java语言的md5加密: public String getMD5

Android基础之——MacOSX下elipse开发环境的配置

前不久换了台macbook,然后自己就把开发环境给配好了,本来这事就这么过去了,今天有位博友留言让我写一篇关于配置的文章,考虑到这个东西确实以后可能还会用,那就写下来,分享给大家,正好自己也再次回顾一下,熟悉熟悉. 一.下载adt mac版下载地址:http://developer.android.com/sdk/index.html 二.配置jdk 下载完成后将adt解压到指定路径,打开终端,使用指令: java -version 如果能够显示具体的版本,说明本机安装有java,那么可以直接使

在Linux环境下使用OpenSSL对消息和文件进行加密(转载)

转自:http://netsecurity.51cto.com/art/201301/378513.htm 1.简介 OpenSSL是一款功能强大的加密工具包.我们当中许多人已经在使用OpenSSL,用于创建RSA私匙或证书签名请求(CSR).不过,你可曾 知道可以使用OpenSSL来测试计算机速度?或者还可以用它来对文件或消息进行加密?本文将介绍几个简单易学的技巧,教你如何使用OpenSSL对消息 和文件进行加密. [相关推荐]:网络安全工具百宝箱 2.对消息进行加密和解密 首先,我们不妨对简