一、 背景:根据项目的要求,须要对配置文件配置的数据库链接字符串进行加密,也就是对ConnectinString节点的内容进行加密存储,同时考虑到代码使用链接字符串不须要进行更改,C#会自动对加密的内容进行解密。html
二、需求:所以考虑单独开发一个winform程序,对配置文件进行加密和解密,经过ConfigurationManager中的OpenMappedExeConfiguration方法建立一个Configuration对象,而后在对这个对象中的指定节点进行操做。数据库
遇到的问题:app
这个方法在当前的目录下产生一个副本("C:\Charles2008.config.config"),并且返回的Configuration对象操做的不是Charles2008.config文件,而是程序自动建立的Charles2008.config.config文件,然而若是我把文件Charles2008.config改名为Charles2008.config.config文件或者删除Charles2008.config文件却提示:ide
参数名: exePath
三、解决方法:从网上寻找帮助,发现还真的有和我遇到如出一辙的问题,只须要在以上的代码进行稍微一点改动便可,改动后不生成文件副本,直接操做文件,更新也是操做此文件。工具
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = @" C:\Charles2008.config ";
// 再调用fileMap 实例化 config , 这样,操做的文件就是Charles2008.config文件了,也不会产生副本文件
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
四、加密链接字符串:上面技术难点解决后,根据获取到Configuration对象Config调用如下方法便可对链接字符串进行加密。(仅针对ConectionString节点)post
if (connectionSection != null)
{
connectionSection.SectionInformation.ProtectSection( " RSAProtectedConfigurationProvider ");
config.Save();
MessageBox.Show( " 保存成功! ", " 提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
五、 备注:this
加密和解密在同一台计算机上使用,在加密过程当中,使用了一个基于本机的密钥。这就意味着加密和解密必须在同一台计算机上进行,不然将不能解密。同时,在一台计算机上加密的配置,在另外一台计算机上将不能正常使用。加密
链接字符串加密工具spa