一直都想对app.config下的数据库连接字符串进行加密,因为程序直接调用数据集的时候必需要调用app.config(程序编译后会自动更名为程序文件名.config),如果数据库连接字符串以明文方式放置在那里,将是意见危险的事情。所以,必须进行加密。
1.我将数据库连接的各个参数(如数据库名,用户,密码,服务器地址)等存放到一个xml文件中,之后对其进行加密,并存放于一个服务器共享目录里面。
2.当程序启动时,采用一个单独的程序来获取加密的数据库连接信息参数,读取服务器共享目录里面的加密xml文档,然后形成字符串“Data Source=(local);Initial Catalog=TclyworkDb;Persist Security Info=True;User ID=sa;Password=sa”
并通过这个单独的程序写入到主程序需要调用的config文件中。
//获取数据库连接配置 strConn = "Data Source=" + ((DataRowView)tabDBServerBindingSource.Current).Row["ServerName"].ToString(); strConn = strConn + ";Initial Catalog=" + ((DataRowView)tabDBServerBindingSource.Current).Row["DBName"].ToString(); strConn = strConn + ";Persist Security Info=True;User ID=" + ((DataRowView)tabDBServerBindingSource.Current).Row["LoginName"].ToString(); strConn = strConn + ";Password=" + ((DataRowView)tabDBServerBindingSource.Current).Row["LoginPwd"].ToString(); strConn=objEncrypt.DesEncrypt(strConn, "123456789"); SaveConfig(strConn); //保存到数据库连接配置文件中. |
private void SaveConfig(string ConnenctionString) { try { XmlDocument doc = new XmlDocument(); //获得配置文件的全路径 string strFileName = AppDomain.CurrentDomain.BaseDirectory.ToString() + "Tclywork.Frame.Module.DbSet.dll.config"; doc.Load(strFileName); //找出名称为“add”的所有元素 XmlNodeList nodes = doc.GetElementsByTagName("add"); for (int i = 0; i < nodes.Count; i++) { //获得将当前元素的key属性 XmlAttribute att = nodes[i].Attributes[1]; //根据元素的第一个属性来判断当前的元素是不是目标元素 if (att.Name == "connectionString") { //对目标元素中的第二个属性赋值 att = nodes[i].Attributes[1]; att.Value = ConnenctionString; break; } } //保存上面的修改 doc.Save(strFileName); } catch (Exception error) { //MessageBox.Show(error.Message); //lMessage.Text = this.Text + "-lueAccount_EditValueChanged-" + error.Message; mMgs.ShowForm(Tclywork.Class.Command.Properties.Resources.msgError, this.Text + "-SaveConfig-" + error.Message); } } |
这样,我就得到一个数据库字符串经过加密的config文件
Tclywork.Frame.Module.DbSet.dll.config 文件内容如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> </configSections> <connectionStrings> <add name="Tclywork.Frame.Module.DbSet.Properties.Settings.TclyworkDbConnectionString" connectionString="wBnJlU9N1bcuQCUFsJJ7GvuvllDHlQGOfEXfFIopLC7BFAIrRd767POIH00wb59pfKsbBqaQZgSMwaxGkowLQNNYSllCKzNN+EgH0Xry5i8B63oRZSUX1Hc/xq2va7yN1pKoeBeVv8IpM8ARjzf4QXdhB1Ql6be9" providerName="System.Data.SqlClient" /> </connectionStrings> </configuration> |
connectionString部分就加密了。
完成以上工作后就需要让主程序能读取到这样的数据库连接字符串信息,并通过解密完成,正常的工作。
首先,我们打开Settings.Designer.cs,发现如下代码:
[global::System.Configuration.ApplicationScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)] [global::System.Configuration.DefaultSettingValueAttribute("Data Source=(local);Initial Catalog=TclyworkDb;Persist Security Info=True;U" + "ser ID=sa;Password=sa")] public string TclyworkDbConnectionString { get { return ((string)(this["TclyworkDbConnectionString"])); } } |
将这部分代码剪切到Settings.cs文件中(如果没有看到这个文件,请双击Settings.settings文件,然后点击上面的“查看代码”)。如果以后出现已经存在的话,就直接删除Settings.cs里面的这段代码。
到了这个时候我们就需要改造一下这段代码,参考如下:
[global::System.Configuration.ApplicationScopedSettingAttribute()] doc.Load(strFileName);
|
好了,到此修改完毕,你所发布的程序里,虽说有config配置文件,但关键的数据库连接字符串却是已经加密的了。
大功告成。
以上是我自己琢磨一点点试出来的,如有指教,请多多联系。