app.config数据库连接字符串的加密

一直都想对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()]
        [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;User ID" +
        //    "=tclyworkDb;Password=tclyworkDb")]
        [global::System.Configuration.DefaultSettingValueAttribute("Data Source=(local);Initial Catalog=TclyworkDb;Persist Security Info=True;User ID=tclyworkDb;Password=tclyworkDb")]
        //wBnJlU9N1bfAAvLAeA7TM7kZGD/DJfIFfsx7sh+6Lq9g+0R7f5u5XkTqKkjraNy6pkmD18vuPdMOE7PYBNsd90NZYNPA5k9sSJCGuvhrmXjyPh7m+2ivHyXZdoHOP0dKobvqrpt9c/Si+aPM3WVs57OSpQTVqzoW
        public string TclyworkDbConnectionString
        {
            get
            {
                try
                {
                    string strTemp = "";
                    XmlDocument doc = new XmlDocument();
                    //获得配置文件的全路径
                    string strFileName = AppDomain.CurrentDomain.BaseDirectory.ToString() + "Tclywork.Frame.Module.DbSet.dll.config";
                    if (File.Exists(strFileName))
                    {

                        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];
                                strTemp = att.Value;
                                break;
                            }
                        }
                        return objEncrypt.DesDecrypt(strTemp, "123456789");
                    }
                    else
                    {
                        return "";
                    }
                }
                catch (Exception error)
                {
                    return "";
                }


            }
            set
            {
                string strTemp = objEncrypt.DesEncrypt(value, "123456789");
                TclyworkDbConnectionString =strTemp  ;
            }
        }

好了,到此修改完毕,你所发布的程序里,虽说有config配置文件,但关键的数据库连接字符串却是已经加密的了。

大功告成。

以上是我自己琢磨一点点试出来的,如有指教,请多多联系。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值