运行时动态设置并加密App.Config中的数据库连接字符串

  App.config中的数据库连接字符串,是在Settings.settings同步过来的。后者在设计时支持数据集DataSet的设计,但运行时不能更改,可以更改App.config的连接字符串,但无法加密、解密。造成的结果是数据库连接字符串,要么固定不变,要么以明文显示,极不安全。多次尝试后,成功的解决这些问题。


我的经验:

  1. Settings.settings中的设置和App.config中的设置会相互更新,彼此同步。前者用于设计支持,后者用于运行时。可以手工阻止两者同步,使两者设置不一样,如果没有发布App.config,则全部采用Settings.settings的设置;否则在运行时App.config会覆盖Settings.settings的设置。

  2. Settings.settings中的Application范围设置只在设计时更改,是只读的属性,User范围设置可以在运行时读写。参考MSDN文章“在 C# 中使用设置”中的说明:
应用程序作用域设置与用户作用域设置之间的重要区别是,用户作用域设置在运行时为读/写,并且可在代码中对其值进行更改和保存。应用程序作用域设置在运行时为只读。虽然可以读取,但是不能对其进行写入。具有应用程序作用域的设置只能在设计时或通过手动修改设置文件进行更改。

   3. Settings中的只有“连接字符串”设置才能被数据集DataSet设计时支持,而“连接字符串”设置只能是Application范围设置,是只读的属性。


解决思路:
  将Settings.settings的设计时代码文件Settings.Designer.cs内容复制到Setgings.cs中,删除Settings.Designer.cs,更改部分代码。连接字符串在Setgings.cs中缺省设置为明码,在App.config中为加密码。代码如下,DESEncrypt为静态加密函数,DESDecrypt为静态解密函数:

重写Settings代码

默认情况下,新的连接字符串设置只在重启时生效。但可以操作数据前,加上一条更改Dataset中Adapter的连接字符串的语句,就可以不用重启,代码如下:

运行更改数据库连接

 


数据库技术就是一坛陈年老酒,越久越香,学以致用。
 
 
====================================================

评论

#1楼    回复  引用  查看    

:``
 

#2楼    回复  引用  查看    

不错

#3楼    回复  引用    

如果我编的是windows应用程序,生成的是App.config,在生成setup后要在局域网中安装使用,请问这个时候的加密怎么写?

#4楼 [楼主]   回复  引用  查看    

To Zhouqi,
修改Properties.Settings类,加入加密解密,关键代码如下
public string ConnectionString1
{
get
{
return Encrypt.DESDecrypt(this["ConnectionString1"].ToString());
}
set
{
base["ConnectionString1"] = Encrypt.DESEncrypt(value);
this.SetKeyValue("A.Properties.Settings.ConnectionString1", Encrypt.DESEncrypt(value));
}
}

#5楼    回复  引用    

这个可以移植吗?就是说我生成的setup文件安装在别的机子上访问的是同一个服务器,可以正常运行吗?我的邮箱zhouqi1234511111@sina.com.cn期待你的答案,谢谢!
 

#6楼 [楼主]   回复  引用  查看    

5楼兄,当然可以移植,Config文档中连接串是加密的,可以复制到其它地方。贴子内容中有详细说明。
 

#7楼    回复  引用    

同样是三楼问题,如果数据库服务器密码变化了,相当于连接字符串更改了。怎么移植。
我简单的看了一下搂主的代码,好像是根据Settings.settings中明文连接字符串,动态生成加密后的写入到APP.config中了,是这样么。
那这样的话三楼的问题就不能解决了。
除非每次变动一次数据库连接密码或用户名,就需要重新打包一次。。。
不可行。。。
不过可以参见用reg-iis对配置文件进行加密。。。
我的邮箱:liuzhitian83@126.com
qq:81640062
不知道我说的对否,有问题及时联系,大家一起探讨。。。
 

#8楼 [楼主]   回复  引用  查看    


再解释一下:
1. 引用Microsoft.Data.ConnectionUI.dll和Microsoft.Data.ConnectionUI.Dialog.dll后,引用using Microsoft.Data.ConnectionUI命名空间,使用DataConnectionDialog类可以调用MS的标准数据库连接配置对话框,解决保存到ConnectionString1中。
当然,你也可以自建一个窗口来读写ConnectionString1值。

2. 配置类的属性ConnectionString1,可以get解密后的字符串,也可以set加密后的字符串,SetKeyValue过程可以保存加密后的字符串(通过读写XML文档实现),Encrypt.DESEncrypt和Encrypt.DESDecrypt是我写的加密和解密函数。

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 读取保存App.config配置文件的完整源码参考(转) http://smartsoft.5d6d.com/thread-6550-1-1.html C# 读取保存App.config配置文件的完整源码参考 最近出差在北京做一个小项目,项目里需要读取配置文件的小功能,觉得挺有参考意义的就把代码发上来给大家参考一下。我们选择了直接用微软的读取配置文件的方法。 这个是程序的运行设计效果,就是把这些参数可以进行灵活设置,灵活保存设置状态。 程序编译后自动会产生相应的配置文件,是跟项目的名称一样的配置文件。 读取配置文件及保存配置的具体代码参考如下,希望能给你节省一些时间,直接复制粘贴这个代码就可以用了: //------------------------------------------------------------ // All Rights Reserved , Copyright (C) 2010 , CDPF , Ltd. //------------------------------------------------------------ using System; using System.Configuration; using System.Windows.Forms; using Utilities; namespace DirectSeeding { /// /// FrmConfig /// 读取配置文件 /// /// 修改纪录 /// /// 2011.01.14 版本: 1.0 JiRiGaLa 完善程序的注释等、从新整理代码。 /// /// 版本:1.0 /// /// /// JiRiGaLa /// 2011.01.14 /// /// public partial class FrmConfig : Form { public FrmConfig() { InitializeComponent(); } /// /// 读取配置文件 /// private void GetConfig() { this.txtWriteFileName.Text = ConfigurationManager.AppSettings["WriteFileName"]; this.txtWritePath.Text = ConfigurationManager.AppSettings["WritePath"].Replace("|", Environment.NewLine); this.txtPostMessageURL.Text = ConfigurationManager.AppSettings["PostMessageURL"]; this.txtLeasedLineURL.Text = ConfigurationManager.AppSettings["LeasedLineURL"]; } private void FrmDirectSeeding_Load(object sender, EventArgs e) { this.GetConfig(); } /// /// 保存配置文件 /// private void SaveConfig() { // 写入参数设置 Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); configuration.AppSettings.Settings["WriteFileName"].Value = this.txtWriteFileName.Text; configuration.AppSettings.Settings["Wri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值