【案例引用】
例如
1
2
3
|
<
connectionStrings
>
<
add
name
=
"EnterpriseWebConnectionString"
connectionString
=
"Data Source=. ; Initial Catalog=Enterprise;User ID=sa;Password=1391018"
providerName
=
"System.Data.SqlClient"
/>
connectionStrings
>
|
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
其中,各个参数的含义如下:
加密一个特定站点的连接字符串就是:
aspnet_regiis.exe -pef "connectionStrings" "你的web项目路径" -prov "DataProtectionConfigurationProvider"
其中DataProctionConfiguartionProvider是Windows数据保护API(DPAPI)提供程序,它使用Windows内置的密码学技术来加解密配置节。默认情况下,这个提供程序使用本机的密钥。
2. 加密方法
运行Visual Studio 2008命令提示
加密后的结果
解密后的结果:
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,默认情况下是明文显示的,例如:
12 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 20"http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /> 5 "http://www.w3.org/2000/09/xmldsig#"> 6 16"http://www.w3.org/2001/04/xmlenc#"> 7 15"http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> 8 "http://www.w3.org/2000/09/xmldsig#"> 9 11Rsa Key 1012 14FSEEyg/SUlE0SqTip30MSc9a/tUYJSDiJ3nDLkE1iGSYU3vo02KRhsTnbLWRSRLffGGWP65fUJJuj5+qiPNQNX0THjCajF43PrP28u9V1fkXuX/T5BxI4Rg2rjw6mSPLuZ1SaQOjJjXi8ArCYs+83qpCxvjml1UN74RlOpLs6qs= 1317 190Qp07JkMSsyTmHADATQ+rkGCok21XBFH2zvtj4diSSsTNJhi3CzBYw6QfasdpyuG/zf+4RWh4aNJ/IrGavzeSyRa929zAv/RsYpR3GQROWt20zr6d7UJUfDgbm85KyZrQNXLwhcfEiUX5VMJg+g3OUczhiDS8YvQ+JjOCDQQPpv99sj8AT2eNCyJJpKWJpGSf0iBpJmkpNP6MOTYHEEmVQ== 18
这么长一串,一定不会有人认出来你的数据库地址和登陆信息了 :)
操作过程如下(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文件,增加:
12 "MyProtectedConfigurationProvider"> 3 4 6 7"MyProtectedConfigurationProvider" type="System.Configuration.RsaProtectedConfigurationProvider" cspProviderName="" useMachineContainer="true" useOAEP="false" keyContainerName="SharedKeys"/> 5
完成!
说了这么多,我累了你也累了。有没有简便一些的办法?有。开发时用明文,部署的时候在客户现场运行aspnet_regiis加密就可以了。(省略号)
在部署项目的时候,我们总是需要加密配置文件中的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"