利用ASP.NET加密和解密Web.config中连接字符串
这篇文章我将介绍如何利用ASP.NET来加密和解密Web.config中连接字符串
背景描述在以前的博客中,我写了许多关于介绍Asp.net, Gridview, SQL Server, Ajax, JavaScript等的文章。大多数情况下,我都把数据库的连接字符串放在了web.config中。其中包含许多敏感信息,包括连接数据库的用户名密码等。然而我们在web.config和machine.config中以纯文本的方式保存密码安全吗?
如果我们的程序只是部署在内部服务器中,这应该没什么问题。但如果我们的程序是运行在共享主机上面,那我们应该提高安全等级了。ASP. NET 2.0提供了一个保护配置模型来加密和解密web.config中sections信息。RSAProtectedConfigurationProvider:默认通过RSA公钥来加密和解密。
通过在命令行中工具运行aspnet_regiis.exe命令,可以对web.config中的连接串进行加密和解密。
第一种方式首先,我们通过在windows命令行中执行aspnet_regiis.exe来加密与解密。
在VS中创建一个新的websit项目,打开web.config,加入数据库连接串,如:
然后我们按下面的步骤来加密和解密数据连接串
<connectionStrings><addname="dbconnection"connectionString="DataSource=RahulMittal;IntegratedSecurity=true;InitialCatalog=MySampleDB"/></connectionStrings>
1.开始菜单>>所有程序>>Microsoft visual studio 2008 >> Visual Studio Tools >> Visual Studio 2008 开发人员命令提示(如果是windows7,点右键与管理员身份运行)
2.在命令窗口中,输入命令aspnet_regiis.exe -pef "connectionStrings" "C:\VisualStudio2008\Authorization"
–pef表明程序是以文件系统的形式建立的。第二个“connectionStrings”是你要加密的configuration 节点名字。第三个参数指名web.config的物理路径。
3.成功执行命令后会显示:加密成功。
现在,再打开程序中的web.config,会变成像下面这样子了。
<connectionStringsconfigProtectionProvider="RsaProtectedConfigurationProvider"><EncryptedDataType="http://www.w3.org/2001/04/xmlenc#Element"xmlns="http://www.w3.org/2001/04/xmlenc#"><EncryptionMethodAlgorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc"/><KeyInfoxmlns="http://www.w3.org/2000/09/xmldsig#"><EncryptedKeyxmlns="http://www.w3.org/2001/04/xmlenc#"><EncryptionMethodAlgorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"/><KeyInfoxmlns="http://www.w3.org/2000/09/xmldsig#"><KeyName>RsaKey</KeyName></KeyInfo><CipherData><CipherValue>ZNUbIEnOwlZzC8qbzHj5F2GS9gLYSkWCIgCJGkrgZAX8A+8oEIssyohhxUKvAubD3jizFc5IjbLGt7HNXhoFhXNTUPYz2y6tdKJDVgDmtCgVf8Z2C990zoMRBJG+VXhmgnlo1vtHYhGx8x/bBzE1prT1+xDpep98vHF22d+LrVI=</CipherValue></CipherData></EncryptedKey></KeyInfo><CipherData><CipherValue>tODWlPD0Q/B/mP14GQ/5tUxcjmhHcy9a0oPunV5osNrMQRztgi2h6V6sxJOEh+NC+G9gQNkv1huXf1s7eoZRRLy5/LDtLXzzqMUOqLSlJUs9igChvi33c9XG4rwGF15Tpn4N34bpQBt94n0rpSkQ18V9HCPzii+UO64PlA+ykDeQhc9aQr4gO3mCfUzmY2S9gsXzRbzdq0oCWBDvx8UkX2uDxaysVHC9Fo7u6IrlpU0+hOdK95Y3/A==</CipherValue></CipherData></EncryptedData></connectionStrings>
我们在程序中并不要写任何代码来解密连接字符串,因为.NET会自动的为我们解密。如果我们要用连接字符串,可以像平常那样调用.
stringstrconnection=ConfigurationManager.AppSettings["dbconnection"].ToString();
如果我们想解密,只需要在VS的命令窗口中,输入aspnet_regiis.exe -pdf "connectionStrings" "C:\VisualStudio2008\Authorization"
成功执行后,会显示解密成功。
再打开web.config,我们可以看到解密后的字符串。
现在,我们知道了如何在文件系统中加密和解密连接字符串。如果我们想加密运行在IIS上的默认网站,就像IE上展示的那样,可以用下面的命令。
加密IIS默认网站的web.config
aspnet_regiis.exe-pe"connectionStrings"-app"/SampleWebSite"
-pe说明程序是运行在IIS上的。第二个参数指名要加密的configuration节点。-app用来指定虚拟目录,最后一个参数就是程序部署的虚拟目录名。
Decrypt connectionStrings inweb.configof IIS based site
解密IIS默认网站上的web.config
aspnet_regiis.exe-pd"connectionStrings"-app"/SampleWebSite"
到这里我们知道如何用命令行工具执行aspnet_regiis.exe命令来加密和解密web.config了。下面我将介绍如何在后台代码中来加密解密web.config。
备注:如果是vs2005 会提示aspnet_regiis 无效 解决办法 开始-》运行-》cdC:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 -》然后接着运行后面的代码即可
第二种方式在第二种方法中我会用RSAProtectedConfigurationProvider和DataProtectionConfgurationProvider来加密解密web.config
首先,打开Default.aspx,添加如下代码:
<htmlxmlns="http://www.w3.org/1999/xhtml"><headrunat="server"><title>UntitledPage</title></head><body><formid="form1"runat="server"><div><asp:Buttonid="btnEncrypt"runat="server"Text="Encrypt"onclick="btnEncrypt_Click"/><asp:ButtonID="btnDecrypt"runat="server"Text="Decrypt"onclick="btnDecrypt_Click"/></div></form></body></html>
打开后台代码,添加下列命名空间:
usingSystem;usingSystem.Configuration;usingSystem.Web.Configuration;
再添加如下代码
stringprovider="RSAProtectedConfigurationProvider";stringsection="connectionStrings";protectedvoidPage_Load(objectsender,EventArgse){}protectedvoidbtnEncrypt_Click(objectsender,EventArgse){Configurationconfg=WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);ConfigurationSectionconfigSect=confg.GetSection(section);if(configSect!=null){configSect.SectionInformation.ProtectSection(provider);confg.Save();}}protectedvoidbtnDecrypt_Click(objectsender,EventArgse){Configurationconfig=WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);ConfigurationSectionconfigSect=config.GetSection(section);if(configSect.SectionInformation.IsProtected){configSect.SectionInformation.UnprotectSection();config.Save();}}
完成之后,打开web.config,添加数据库连接字符串
<connectionStrings><addname="dbconnection"connectionString="DataSource=RahulMittal;IntegratedSecurity=true;InitialCatalog=MySampleDB"/></connectionStrings>
现在运行程序并点击加密按钮之后,再打开web.config,会变成下面那样:
<connectionStringsconfigProtectionProvider="RsaProtectedConfigurationProvider"><EncryptedDataType="http://www.w3.org/2001/04/xmlenc#Element"xmlns="http://www.w3.org/2001/04/xmlenc#"><EncryptionMethodAlgorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc"/><KeyInfoxmlns="http://www.w3.org/2000/09/xmldsig#"><EncryptedKeyxmlns="http://www.w3.org/2001/04/xmlenc#"><EncryptionMethodAlgorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"/><KeyInfoxmlns="http://www.w3.org/2000/09/xmldsig#"><KeyName>RsaKey</KeyName></KeyInfo><CipherData><CipherValue>WagJ9DDjWTNc1nmYVNQXaQqXalQzXaiCHAOtUJvTWBRZiuT6UK1fBElM80PnL6dC5Umb8qvfHdkSMgoMW9CJzwOTZ0zTy17JBGZqRQmlfW2G9LacoWIil0UrxjhgmJmRXhwXHFpdGwEVl7AoQGVlJGabXuChutaTxmfGOoUbCr0=</CipherValue></CipherData></EncryptedKey></KeyInfo><CipherData><CipherValue>qry5qnr3qxOgyoNPeP7OKEiHpr/PPTsaeQ2mYUsSK7cg4Kkl9uPO4RyUXgBIkgCTsjbObqLlyndcSBnYyek6bxG/IBL82G1R5J1ci8i1eyt8kIDqouzYOx5vtouErld4z1L+7WGf9Wg37QAH5RiiEfkCHndJJq3dTqjxnnXZSno6NgbxSXDfqzwE/eKDVhGV3oaTQSfjVmO8e5a9wvREYeeyasDhojx8J2mdy7/Q9rEIpv98RTiRxA==</CipherValue></CipherData></EncryptedData></connectionStrings>
如果我们想用DataProtectionConfigurationProvider来实现加密与解密,只需在代码中将RSAProtectedConfigurationProvider替换成DataProtectionConfigurationProvider即可。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。