看了SHY520寫的關於Data Access Application Block的文章,寫得不錯,忽略了一點就是如何去加密數據庫連接字符串,這兒我簡單的介紹一下。我們知道,在Enterprise Library1.1中加密連接字符串,需要依賴於Cryptography Application Block。.NET Framework2.0中已經內置了這項功能,通過Configuration命名空間下的一些類來完成,支持兩種類型的加密:
DPAPIProtectedConfigurationProvider:使用Windows Data Protection API (DPAPI)
RsaProtectedConfigurationProvider:使用RSA算法
下面來看一下具體的實現方法,假設已經有這樣的一個配置文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
</configSections>
<dataConfiguration defaultDatabase="QuickStarts" />
<connectionStrings>
<add name="QuickStarts" connectionString="Database=EntLibQuickStarts;Server=RJ-097;Integrated Security=SSPI;"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
1.添加對System.Configuration.dll的引用
2.在Program.cs中引入命名空間
using System.Configuration;
3.編寫相關的代碼:
/**//// <summary>
/// Author:TerryLee
/// From:http://terrylee.cnblogs.com
/// </summary>
static void EncryptConfiguration()
{
// 使用什麼類型的加密
string provider = "RsaProtectedConfigurationProvider";
Configuration config = null;
config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
// 加密連接字符串
ConfigurationSection section = config.ConnectionStrings;
if ((section.SectionInformation.IsProtected == false) &&
(section.ElementInformation.IsLocked == false))
{
section.SectionInformation.ProtectSection(provider);
section.SectionInformation.ForceSave = true;
config.Save(ConfigurationSaveMode.Full);
}
}
該方法的調用放在程序的主程序的入口點:
[STAThread]
static void Main()
{
// Protect the Connection Strings
EncryptConfiguration();
Application.Run(new MainForm());
}
運行程序後,打開配置文件可以看到,連接字符串已經變成密文了。最後注意一點:加密的字符串在被加載到內存的時候解密。