Enterprise Library2.0中加密数据库连接字符串

看了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());

}

运行程序后,打开配置文件可以看到,连接字符串已经变成密文了。最后注意一点:加密的字符串在被加载到内存的时候解密。

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2006-06-05 11:49 TerryLee 阅读(5079) 评论(35)  编辑 收藏 网摘 所属分类: [10]  模式与实践[01]  .NET大本营

  回复  引用  查看    
#1楼 2006-06-05 13:11 | SHY520      
@TerryLee
当时也有人在回复中问我,我就在回复里面写了,呵呵.:)
  回复  引用  查看    
#2楼 [楼主]2006-06-05 17:28 | TerryLee      
@SHY520

我没注意看,昨天有人问我,我就想顺便写一下,呵呵^_^
  回复  引用    
#3楼 2006-06-08 16:36 | FrX [未注册用户]
TerryLee你好,“加密的字符串在被加载到内存的时候解密” ,是什么意思?是不是 DatabaseFactory.CreateDatabase() 会自动解密呀?


  回复  引用    
#4楼 2006-07-19 01:04 | 诺曼 [未注册用户]
被加载到内存时如何进行解密?

  回复  引用    
#5楼 2006-08-01 09:29 | FrX [未注册用户]
请问:被加载到内存时,何时,如何进行解密? :-)
  回复  引用  查看    
#6楼 [楼主]2006-08-01 09:39 | TerryLee      
@FrX

由配置类自动解密
  回复  引用    
#7楼 2006-10-31 17:50 | 加大码[匿名] [未注册用户]
能不能只加密密码?
  回复  引用    
#8楼 2006-10-31 17:53 | 加大码[匿名] [未注册用户]
另外,请问配置类如何知道我使用了哪种加密类型?
  回复  引用  查看    
#9楼 [楼主]2006-10-31 19:42 | TerryLee      
@加大码[匿名]
这种办法的加密不能只加密密码,它是对配置区的加密

加密类型有两种,我也不太清楚应用程序是如何选择解密的
  回复  引用    
#10楼 2006-11-01 13:53 | spider[匿名] [未注册用户]
我想把webservice的web.config数据库连接字符串加密,用上面的代码不行,应该怎样做呢
  回复  引用  查看    
#11楼 [楼主]2006-11-01 20:22 | TerryLee      
@spider[匿名]
自己写一个小工具啊,把加密后的内容放在Web.config中,在用的时候解密
  回复  引用    
#12楼 2007-01-22 11:31 | 哈哈[匿名] [未注册用户]
用上面的代码加密不了啊!!!,运行完以后还是老样子,根本没有加密。对
config的文件名有要求吗?
  回复  引用  查看    
#13楼 [楼主]2007-01-22 13:12 | TerryLee      
@哈哈[匿名]
把.config文件的只读属性去掉,再试试
  回复  引用    
#14楼 2007-01-22 19:13 | 哈哈[匿名] [未注册用户]
不是只读的呀,能把你的哪个demo发给我吗 1zhk@163.com.THX
  回复  引用    
#15楼 2007-01-26 17:35 | xlx [未注册用户]
怎么不行呢?李兄
我用的ASP.NET的,用的是EL3.0
  回复  引用    
#16楼 2007-01-26 17:37 | xlx [未注册用户]
运行时出现以下错误:

"当不在独立 exe 内部运行时,必须指定 exePath。 "


而我放在protected void Application_Start(Object sender, EventArgs e)中,也是不可以的
  回复  引用    
#17楼 2007-03-18 21:50 | 2 [未注册用户]
加密不了

  回复  引用    
#18楼 2007-03-18 22:50 | 2 [未注册用户]
加密不了 可不可以把详细步骤发给我 sigan_1984@163.com 谢谢
  回复  引用  查看    
#19楼 2007-08-03 11:04 | xiao_p      
应该在安装文件安装的时候进行加密。这样个人认为比较好一些。当然是针对winform的项目。
  回复  引用    
#20楼 2008-01-15 10:42 | 菜鸟毛 [未注册用户]
大哥,我按你的方法试了,APP.config文件没有变化。真的。而且属性也是正常不是只读。请指教啊。~~~拜一下!
  回复  引用    
#21楼 2008-01-23 10:54 | 菜鸟毛 [未注册用户]
是我太菜了,已经搞定~~哈哈,博主勿怪!^_^
  回复  引用    
#22楼 2008-01-23 10:59 | 菜鸟毛 [未注册用户]
是在Debug下的“应用程序名.config”中改变了。原始的App.config并没有变。唉,我的猪脑袋……
  回复  引用    
#23楼 2008-03-10 23:52 | bkjh [未注册用户]
3.1的直接在配置工具选择下就可以了
  回复  引用    
#24楼 2008-11-12 23:46 | jianxy [未注册用户]
李兄:这样加密后的配置文件用Enterprise Library一样可以打开,而且打开的是未加密的app.config,怎么能让Enterprise Library也不能看到配置区或连接?谢谢。
  回复  引用  查看    
#25楼 2008-12-04 18:11 | Bob&xiaobo.liu      
博主 感谢你关于enterprise library 的系列讲解,对于学习和使用entlib很有帮助,感谢感谢,但关于此篇讲述的数据库连接字符串,我还有些疑问:
如果利用entlib的话(现在已经是4.0啦) 我们提供给用户一个怎样的关于连接字符串的解决方案要好呢
应该需满足如下需求:
1.可修改连接字符串
满足这种需求是否需客户必须能够见到明文的连接字符串啊?楼上的应该是考虑到安全问题才需要configration manager看到的也是加密的 那如果我向修改呢
2.安全系数尽可能的高
关于连接字符串使用什么样的加密方式相对来说满足其他需求安全系数又较高的?之前我试过利用配置工具生成一个key文件,但拷贝key文件换台机器就不能使啦,似乎是使用了DAAPI,所以只能在特定的机器上使用

个人觉得最理想的情况是key文件可以通过拷贝在不同的机器上使用,通过key文件可看到明文的连接字符串进行更改

利用博主如上代码我们确实可以很好的对连接字符串进行加密,但这种方式似乎更适合用于C/S的项目,B/S的项目怎样能在项目开发和实施过程中更好的利用配置工具?盼回复 谢谢




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

相关文章:

相关链接: