asp.net C#中对Web.Config字符串加密与解密的方法

【案例引用】

例如

XML/HTML code
?
1
2
3
< connectionStrings >
         < add  name = "EnterpriseWebConnectionString"  connectionString = "Data Source=. ; Initial Catalog=Enterprise;User ID=sa;Password=1391018"  providerName = "System.Data.SqlClient" />
     connectionStrings >

如何给Data Source=. ; Initial Catalog=Enterprise;User ID=sa;Password=1391018" providerName="System.Data.SqlClient 加密?
在程序中如何调用?能否给个例子?有没有方便加解密的小工具呢?

1. .NET本身已经提供有Encrypt命名空间的一些加密算法,有对称的,也有非对称的。当然,你也可以设计自己的一个加密算法。
2. 无论是Web应用,还是Winform应用,连接串都通常是保存在web.config或者app.config里的,并且提供了相应的一个Singleton模式的类来提供对连接串的访问。
3. 你需要做的,就是每次连接前,利用这个Singleton类把连接串密文取出,解密后再把明文作为参数传递给Connection对象的构造子进行连接。

1.先来看看如何在web.config中写入数据库连接字符串.打开web.config文件,一开始web.config文件里默认就有两个配置节,分别是"","",在这两个配置节下都可以写入连接字符串,一般来说是在中写,如:


或者写在中:

 

在以上两种方式中,name和key的值是连接字符串的"名字",就和一个变量的变量名一样,connectionString的值是具体的连接字符串内容.
2.asp.net2.0中读取web.config数据库连接字符串2种方法
方法一:
string myConn = System.Configuration.ConfigurationManager.ConnectionStrings["sqlConnectionString"].ConnectionString;
方法二:
string connString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["sqlConnectionString"].ToString();
3.web.config中连接字符串的加密解密
加密:
asp.net里面web.config文件中的连接字符串是以明码形式保存的,通常存储内容包括数据库服务器名称、数据库名称、账号、甚至包括密码。
为了解决这个问题,ASP.NET 2.0支持一种将连接字符串等敏感信息加密存储于是Web.config文件中的方法.进入.net 的SDK命令提示符,使用命令行工具aspnet_regiis.exe.该应用程序位于“%systemroot%\Micrsoft.NET\Framework\versionNumber”文件夹中。aspnet_regiis.exe是一种常见的命令行解释器,开发人员只需按照简单的语法要求输入命令,就可以完成连接字符串的加密或解密的任务。
  假设需要加密的Web.config文件位于“D:\website2”文件夹中,则使用的命令行如下。
  aspnet_regiis.exe -pef “connectionStrings” “D:\website2”
  参数"-pef"表示根据文件绝对路径执行加密配置节;“connectionStrins”表示所加密的配置节名称;“D:\website2”表示Web.config文件所在文件夹绝对路径。  加密结束后,aspnet_regiis.exe将提示开发人员加密成功
解密:连接字符串加密后,其它人很难在不经过解密的情况下,了解具体的连接字符串内容。
解密的命令如下: aspnet_regiis.exe -pdf “connectionStrings” “D:\website2”  需要注意的是,加密过程中使用了一个基于本机的密钥,这意味着解密过程必须在同一台计算机上完成。如果是将加密后的Web.config文件移动到其它计算机上,那么Web.config文件中的连接字符串将不能够正常解密。注意,加密是-pef,解密是-pdf,不要搞错了。

上述整理成BAT批处理脚本:

-----------------------------------------------

连接字符串加密

-----------------------------------------------
@echo off
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pef "connectionStrings" "C:\Program Files\Microsoft\.NET Pet Shop 4.0\Web"
PAUSE


-----------------------------------------------
连接字符串解密

-----------------------------------------------
@echo off
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pdf "connectionStrings" "C:\Program Files\Microsoft\.NET Pet Shop 4.0\Web"
PAUSE

【详细介绍】

在WEB网站开发过程中,如果我们将数据库连接字符串封装到.DLL文件中,将会给数据库和程序的迁移带来麻烦,因为万一服务器地址或者数据库发生变更,那么我们就不得不修改源程序并重新将其编译。更好的解决方法是将数据库连接字符串写入到web.config配置文件中,可问题是将连接字符串写入到web.config文件中之后,任何人都能打开看到所连接的数据库名和密码,又会带来安全隐患,因此为了保证数据库的安全性,我们可以通过使用微软IDE自带的命令aspnet_regiis.exe将配置文件web.config中指定的标签进行加密,如果以后想查看加密后的连接字符串,我们还可以使用aspnet_regiis.exe将加密后的字符串进行解密。


1.    加密通用语法 
  加密一个特定网站的web.config文件的通用形式
  aspnet_regiis.exe -pef secion physical_directory -prov provider
  或
  aspnet_regiis.exe -pe secion -app virtual_directory -prov provider
  其中,各个参数的含义如下:

  •      section表示要加密的配置节
  •      physical_directory用于指定站点的物理路径。
  •      virtual_directory用户指定虚拟路径。
  •      provider指定加密提供程序。

    加密一个特定站点的连接字符串就是:
    aspnet_regiis.exe -pef "connectionStrings" "你的web项目路径" -prov "DataProtectionConfigurationProvider"
    其中DataProctionConfiguartionProvider是Windows数据保护API(DPAPI)提供程序,它使用Windows内置的密码学技术来加解密配置节。默认情况下,这个提供程序使用本机的密钥。


2.    加密方法

 

  运行Visual Studio 2008命令提示


   

  加密后的结果

[xhtml] view plain copy
  1.   <connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">  
  2. <EncryptedData>  
  3.  <CipherData>    <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAy1WyvzomB0WAlqYo+ogiigQAAAACAAAAAAADZgAAqAAAABAAAADbDjp+bAce//lsg/so66+8AAAAAASAAACgAAAAEAAAANlF3b73Kdupv/cAf4a9nPUwAQAAoTvrHdAjNjaJFEfiG7pD6sG8GMNJKGpnd4JLchu7W9XhOuPgG4C/LD9H9WQ9uF3t/0MoMI9tbrWdFJ1Yu5/e3PAV4RCbCvDlPD0VC7hxtDMqfRjQ+1OhTdk2woiSNpx0TzXwZE25o4vlXq/aYri1Wmlo2zyRqSkg0hQFQbObCf7lrgWEUjsv+pEOS5OVXcgNhFipVMy5iQ8sH5fNHmGg8gu5JlZQaOqYFG8ci7MGOebcQzR67krJXRBrs26lZtAj8lzf2bK+QcSqtU7Rt4C33JbLqisPL9xhfoUl9GvGTu5VS1S1H5VtErTeYXxnL7PTIr3cNjIbDMjI48LJfoOgtymT35KUdK3J0DxB68DqPaeK5QSEC/L0+6bizStRZ7BDnOngV/XfiVJnbSNYXX5IShQAAACuGn8QGUuQ4TOzkKcc891SV/CVDQ==CipherValue>  
  4.  CipherData>  
  5. EncryptedData>  
  6. lt;/connectionStrings>  

3.    解密 
   解密该连接字符串也很简单
   aspnet_regiis.exe -pdf "connectionStrings" '你的web项目路径"

   解密后的结果:

[xhtml] view plain copy
  1. <connectionStrings>  
  2.     <add name="Sql" connectionString="Data Source=.;Initial Catalog=MySchool;Integrated Security=True" />  
  3. connectionStrings>  


4.    后台代码读取配置文件web.config中数据库连接字符串的方法:
 
[c-sharp] view plain copy
  1. using System.Configuation;  
  2. …  
  3. protected void Page_Load(object sender, EventArgs e)  
  4. {  
  5.     lblMessage.Text = ConfigurationManager.ConnectionStrings["Sql"].ToString();  
  6.  }  
  7. …  

   运行效果图: 


5.    在连接字符串的加密和解密的过程中,需要注意一下几点。 

  •      使用加密的连接字符串

    使用加密的连接字符串不需要编码解密,ASP.NET会自动对加密内容进行解密。

  •      加密和解密在同一台计算机上使用

    在加密过程中,使用了一个基于本机的密钥。这就意味着加密和解密必须在同一台计算机上进行,否则将不能解密。同时,在一台计算机上加密的配置,在另一台计算机上将不能正常使用。

  •      中文路径问题

    该命令对中文支持不是很好。如果站点的路径中有中文字符,也许不能正常加解密。


【网络参考】

1、C#中Web.Config加密与解密的方法_C#教程  http://www.jb51.net/article/35996.htm

2、.NET加密配置文件connectionStrings节点 - http://www.cnblogs.com/zfanlong1314/p/3974950.html

3、web.config本地加密解密方法_http://jingyan.baidu.com/article/95c9d20dac8f40ec4f756167.html

对web.config的ConnectionString加密

      web.config配置文件中,有一些敏感数据希望被保护起来,例如数据库的连接串ConnectionString,默认情况下是明文显示的,例如:

1 
2     
3     "ConnectionString" value="Data Source=127.0.0.1;Initial Catalog=Demo2012;User ID=sa;password=123456"/>
4   

  经过加密之后,配置信息变为:

复制代码
 1 "RsaProtectedConfigurationProvider">
 2     "http://www.w3.org/2001/04/xmlenc#Element"
 3       xmlns="http://www.w3.org/2001/04/xmlenc#">
 4       "http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
 5       "http://www.w3.org/2000/09/xmldsig#">
 6         "http://www.w3.org/2001/04/xmlenc#">
 7           "http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
 8           "http://www.w3.org/2000/09/xmldsig#">
 9             Rsa Key
10           
11           
12             FSEEyg/SUlE0SqTip30MSc9a/tUYJSDiJ3nDLkE1iGSYU3vo02KRhsTnbLWRSRLffGGWP65fUJJuj5+qiPNQNX0THjCajF43PrP28u9V1fkXuX/T5BxI4Rg2rjw6mSPLuZ1SaQOjJjXi8ArCYs+83qpCxvjml1UN74RlOpLs6qs=
13           
14         
15       
16       
17         0Qp07JkMSsyTmHADATQ+rkGCok21XBFH2zvtj4diSSsTNJhi3CzBYw6QfasdpyuG/zf+4RWh4aNJ/IrGavzeSyRa929zAv/RsYpR3GQROWt20zr6d7UJUfDgbm85KyZrQNXLwhcfEiUX5VMJg+g3OUczhiDS8YvQ+JjOCDQQPpv99sj8AT2eNCyJJpKWJpGSf0iBpJmkpNP6MOTYHEEmVQ==
18       
19     
20   
复制代码

  

  这么长一串,一定不会有人认出来你的数据库地址和登陆信息了   :)

 

      操作过程如下(RsaProtectedConfigurationProvider加密):

      1:运行cmd,并定位到C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727(可以直接运行vs2005的命令提示工具,但是貌似vs2010默认指向的framework3.5里没有aspnet_regiis命令,为了避免有些人找不到,所以还是直接cmd比较好。)

      2:运行

1 aspnet_regiis -pef "appSettings" "D:\demo"   //显示"正在加密配置节,成功!"

          这里要注意一下,D:\demo是工程的路径,可以是绝对路径,也可以是网站的相对路径,具体方法可以参考aspnet_regiis的帮助。如果你把web.config放在d盘根目录下,那么路径就是"D:\\"。appSettings是要加密的节点名称,也可以针对某个节点的子节点进行加密,例如

1 aspnet_regiis -pef "system.web/authentication" "D:\demo"

      加密完成后,除了视觉上变为复杂的字符串之外,使用上与加密前是完全相同的。解密时运行参数-pdf,例如:

1 aspnet_regiis -pdf "appSettings" "D:\demo"  //显示"正在解密配置节,成功!"

     

      经过加密的字符串,虽然可以在本机使用,但是在另外一台电脑上(客户现场或服务器)是无法直接使用的。需要进行一些配置。

      1:创建秘钥容器(pc-操作容器 -exp,可导出)

1 aspnet_regiis -pc "MyKey" -exp

      2:导出容器中的秘钥到xml中(px操作容器文件,注意D:\\后面有一个空格,否则你找不到文件的  ^ ^)

1 aspnet_regiis -px "MyKey" "D:\\ keys.xml" -pri

      3:拷贝你的keys.xml文件到服务器上,并且导入秘钥。(-pi导入容器里的秘钥)

1 aspnet_regiis -pi "MyKey" “D:\keys.xml”

      4:赋权限(ASPNET权限)

1 aspnet_regiis -pa "MyKey" "ASPNET"

      5:修改web.config文件,增加:

复制代码
1  
2  "MyProtectedConfigurationProvider">
3  
4  "MyProtectedConfigurationProvider" type="System.Configuration.RsaProtectedConfigurationProvider" cspProviderName="" useMachineContainer="true" useOAEP="false" keyContainerName="SharedKeys"/>
5  
6  
7  
复制代码

      完成!

      说了这么多,我累了你也累了。有没有简便一些的办法?有。开发时用明文,部署的时候在客户现场运行aspnet_regiis加密就可以了。(省略号)

asp.net对连接字符串加密解密

在部署项目的时候,我们总是需要加密配置文件中的ConnectionStrings或者appSettings配置节,从而防止用户数据库被泄漏。.NET Framework使用提供程序模型来加密配置节,框架包含两个ProtectedConfigurationProvider:一个是RsaProtectedConfigurationProvider另一个DpapiProtectedConfigurationProvider.  前者是默认的提供程序,我们尽可能去使用该种,因为它支持导入\导出加密的密钥,换句话说,可以从一个web服务器移动配置节到另一个web服务器,例如可以在你开发的机子上加密配置节,然后将应用部署到产品服务器。
  如果使用后者加密配置节,那么就不能在另一个web服务器解密配置节,如果希望在不同的服务器之间移动配置文件,那么应现在员服务器上解密,再在目标服务器上重新加密配置文件。
1.使用aspnet_regiis.exe工具加密配置节
对于加密web配置文件中一个配置节来说,这是最方便的手段,该工具位于

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


目录下
我们可以手工在cmd dos窗口中敲入路径使用该工具或者直接在开始菜单中找到Microsoft Visual Studio 2005-》Visual Studio Tools-》Visual Studio 2005 命令提示,打开该dos窗口,这里不需要输入aspnet_regiis.exe工具的路径
假如我们有个网站在D:\Projects\mywebsite中
我们需要加密该网站的webconfig的appSettings配置节的方法如下

1 aspnet_regiis -pef appSettings "D:\Projects\mywebsite"
 
     


以上我们使用的是绝对路径,当然也可以使用相对路径

1 aspnet_regiis -pef appSettings "D:\Projects\mywebsite"
 
     


-app表示指定应用程序的虚拟路径

再次打开该web.config,发现appSetting配置节已经加密了。


当然我们需要加密connectionStrings配置节只要加上面代码的 appSetting替换下就ok了
我们注意下 -pef(Protect Encrypt Filepath) 这个选项,它是用来加密指定路径下的web.config文件的指定配置节
当然还有解密啦....
我们可以使用-pdf选项解密配置节,还拿上面的例子

1 aspnet_regiis -pdf appSettings "D:\Projects\mywebsite"
 
     


虚拟路径

1 aspnet_regiis -pd appSettings -app /mywebsite
 


  假设我们使用RsaProtectedConfigurationProvider加密配置文件,现在需要从一个服务器复制一个加密配置文件到另一个服务器,则必须复制加密配置文件的密钥到新的服务器,否则应用程序就不能在新服务器读取加密后的配置文件
默认情况下,存放密钥的容器在下面的文件夹下:

1 \Document and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys
 
     


当然,你很有可能找不到该文件夹(o(∩_∩)o ),现在比如360的搬移打文件等工具,鬼知道,那些文件夹会不会移动到别的地方去了....慢慢找下

我的是在

1 C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
 
     


在MachineKeys目录下会有一些数字和字母组成的系统文件,这就是我们想找的哈


我们还必须配置一个新的密钥容器,导入密钥容器到新服务器,需要依次完成下面几个步骤


1-创建一个新的密钥容器

1 aspnet_regiis -pc "SharedKeys" -exp
 
     


SharedKeys是新的密钥容器,-exp说明该容器的密钥可以导出


2-配置应用程序使用新的密钥容器
web.config:

复制代码
1 <configuration>
2 <configProtectData defaultProvider="MyProtectedConfigurationProvider">
3 <providers>
4 <add name="MyProtectedConfigurationProvider" type="System.Configuration.RsaProtectedConfigurationProvider" cspProviderName="" useMachineContainer="true" useOAEP="false" keyContainerName="SharedKeys"/>
5 providers>
6 configProtectedData>
7 configuration>
复制代码
 
     


3-导出SharedKeys容器中的密钥到一个keys.XML文件中

1 aspnet_regiis -px "SharedKeys" keys.xml -pri
 
     


4-把刚创建的keys.xml文件复制到目标服务器上,并导入密钥

1 aspnet_regiis -pi "SharedKeys" keys.xml
 
     

5-赋予asp.net应用程序访问密钥容器的权限

1 aspnet_regiis -pa "SharedKeys" "ASPNET"

详细链接:http://www.cnblogs.com/wayshan/archive/2012/04/09/web_config.html

你可能感兴趣的:(asp.net C#中对Web.Config字符串加密与解密的方法)