ConnectionString中的数据库登录密码加密

使用VS.NET进行WINFORM + MS SQL编程,一开始我们都会做以下几件事情:
  1. 连接到数据库;(如果你通常都是采用Windows集成验证,那么这篇文章可能你不需要看下去了点击看大图)假设你采用的是SA + 密码的验证方式;
  2. 添加新数据源;VS.NET在这里提醒我们,连接串里面包含了敏感信息;
  3. 把连接字符串保存到程序的配置文件里,便于使用和维护;
假设我的项目名字是Test,现在当我们打开项目的App.config文件,没错,我的SA密码以明文的方式保存在那里了。
点击看大图 <? xmlversion="1.0"encoding="utf-8"  ?>
点击看大图
点击看大图
< configuration >
点击看大图
点击看大图    
< configSections >
点击看大图
点击看大图    
</ configSections >
点击看大图
点击看大图    
< connectionStrings >
点击看大图
点击看大图        
< addname ="Test.Properties.Settings.TestConnectionString"
点击看大图
点击看大图            connectionString
="Data Source=.;Initial Catalog=TEST_ERP;Integrated Security=False;uid=sa;password=shiny"
点击看大图
点击看大图            providerName
="System.Data.SqlClient"   />
点击看大图
点击看大图    
</ connectionStrings >
点击看大图
点击看大图
</ configuration >

生成EXE,在输出目录下面会产生一个Text.exe.config文件,刚才App.config里面的内容复制到了这个文件,这个是发布的时候需要安装到用户程序路径的,由于是文本文件,我们可以很轻松的根据用户的实际环境修改里面的连接设置。但是,sa的密码保存在里面怎么说也是很令人忐忑的事情。

一个很自然的思路,我们可以把这个密码字符串经过加密再保存,要用的时候再解密,以下是我具体的做法。
我采用的是DES的加密方式,也许你喜欢其他的加密算法,反正只要有对应的解密算法,都没问题。
这个是我在网上找的加密工具类,公开了加密和解密的方法。
 1 点击看大图      class  CryptClass
 2 点击看大图     {
 3点击看大图        //默认密钥向量
 4点击看大图        private static byte[] Keys = 0x120x340x560x780x900xAB0xCD0xEF };
 5点击看大图        public static string EncryptKey = "12345678";
 6点击看大图        
 7点击看大图        /// <summary>
 8点击看大图        /// DES加密字符串
 9点击看大图        /// </summary>
10点击看大图        /// <param name="encryptString">待加密的字符串</param>
11点击看大图        /// <param name="encryptKey">加密密钥,要求为8位</param>
12点击看大图        /// <returns>加密成功返回加密后的字符串,失败返回源串</returns>

13点击看大图        public static string EncryptDES(string encryptString, string encryptKey)
14点击看大图        {
15点击看大图            try
16点击看大图            {
17点击看大图                byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(08));
18点击看大图                byte[] rgbIV = Keys;
19点击看大图                byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
20点击看大图                DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
21点击看大图                MemoryStream mStream = new MemoryStream();
22点击看大图                CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
23点击看大图                cStream.Write(inputByteArray, 0, inputByteArray.Length);
24点击看大图                cStream.FlushFinalBlock();
25点击看大图                return Convert.ToBase64String(mStream.ToArray());
26点击看大图            }

27点击看大图            catch
28点击看大图            {
29点击看大图                return encryptString;
30点击看大图            }

31点击看大图        }

32点击看大图
33点击看大图        /// <summary>
34点击看大图        /// DES解密字符串
35点击看大图        /// </summary>
36点击看大图        /// <param name="decryptString">待解密的字符串</param>
37点击看大图        /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
38点击看大图        /// <returns>解密成功返回解密后的字符串,失败返源串</returns>

39点击看大图        public static string DecryptDES(string decryptString, string decryptKey)
40点击看大图        {
41点击看大图            if (decryptString == "")
42点击看大图                return "";
43点击看大图            try
44点击看大图            {
45点击看大图                byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
46点击看大图                byte[] rgbIV = Keys;
47点击看大图                byte[] inputByteArray = Convert.FromBase64String(decryptString);
48点击看大图                DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
49点击看大图                MemoryStream mStream = new MemoryStream();
50点击看大图                CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
51点击看大图                cStream.Write(inputByteArray, 0, inputByteArray.Length);
52点击看大图                cStream.FlushFinalBlock();
53点击看大图                return Encoding.UTF8.GetString(mStream.ToArray());
54点击看大图            }

55点击看大图            catch
56点击看大图            {
57点击看大图                return "";
58点击看大图            }

59点击看大图        }

60点击看大图    }


用你的密码,和自己选择好的密钥(记住要8位字符串)作为参数,调用一下上面的EncryptDES,得到加密后的密码字符串,用它把Test.exe.config里面的密码替换,现在我的config文件里面是:
connectionString="Data Source=.;Initial Catalog=TEST_ERP;Integrated Security=False;uid=sa;
    password=&quot;gcEHA/213uBLSOruspbHyQ==&quot;
"

[注意:不要修改App.config里面的内容,这样的话,你在设计期开发环境里面的数据源就连接不上了,而且,要留意别让生成程序的时候VS把你的修改冲掉了,只需要把App.config的属性"复制到输出目录" 设置为不复制就可以了]

下面我们来看看怎么在运行的时候解密出原来的密码:
如果你总是自己用代码创建SQLConnection,那么只需要在创建前把ConnectionString里面的password部分解密就好了,利用上面加密类的解密函数。
问题是我们都是很普遍的使用VS帮我们创建好的强类型的Dataset,和强类型的DataAdapter。而这些DataAdapter已经包含了创建SQLConnection的代码,他们通过读取程序配置的方式获得连接串,方式如下:
    this._connection.ConnectionString = global::Test.Properties.Settings.Default.TestConnectionString;//这个属性是只读的

程序配置是在程序第一次需要读取的时候加载的,我们需要改动它的默认行为,加入解密的操作。

1.展开项目树下面的Properties文件夹,双击Settings.settings节点;
2.在显示的窗口里面点击上面的查看代码,此时将会在你的项目下产生一个Settings.cs源文件;
3.修改里面的代码如下:

点击看大图 namespace  Test.Properties  {
点击看大图
点击看大图    
using Utilities;
点击看大图    
using System.Data.SqlClient;
点击看大图    
using System.Data.OleDb;
点击看大图    
internal sealed partial class Settings {
点击看大图
点击看大图        
public Settings() {
点击看大图            
// // To add event handlers for saving and changing settings, uncomment the lines below:
点击看大图            
//
点击看大图            
// this.SettingChanging += this.SettingChangingEventHandler;
点击看大图            
//
点击看大图
            this.SettingsLoaded += this.SettingsLoadedEventHandler;
点击看大图            //
点击看大图
        }

点击看大图        
点击看大图        
private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) {
点击看大图            
// Add code to handle the SettingChangingEvent event here.
点击看大图
        }

点击看大图        
点击看大图        
private void SettingsLoadedEventHandler(object sender,System.Configuration.SettingsLoadedEventArgs e) {
点击看大图            
// Add code to handle the SettingsSaving event here.
点击看大图
            SqlConnectionStringBuilder ConnSb = new SqlConnectionStringBuilder();
点击看大图            
string s1;
点击看大图            ConnSb.ConnectionString 
= this["TestConnectionString"].ToString();
点击看大图            ConnSb.Password 
= CryptClass.DecryptDES(ConnSb.Password, CryptClass.EncryptKey);
点击看大图            s1 
= ConnSb.ConnectionString;
点击看大图

点击看大图            SetConstr(s1);
点击看大图        }

点击看大图
点击看大图        
public void SetConstr(string connstr1)
点击看大图        
{
点击看大图            
this["TestConnectionString"= connstr1;
点击看大图        }

点击看大图    }

点击看大图}

点击看大图

上面代码,public了SetConstr方法,以便于在程序的其他模块还可以有机会动态修改连接串。

用于加密.net WebForm的Web.Config文件数据库连接字符串. 本软件支持.net 2.0 和 .net 4.0. 注意事项: 1.需要安装.net4.0运行库才能运行. 2.程序需要获取web.config路径时,可以使用复制把web.config所在路径粘贴到程序.快捷键不是Ctrl + V而是右键选择"编辑"-"粘贴".如果右键点击程序窗口无效,可以右键点击程序标题栏. 扩展知识: 连接字符串的安全性 一、尽量使用windows验证而不是sql server验证: 1、安全性易管理 2、不需要设置用户名和密码(这样传递的时候不会被截取吧) 3、密码不会通过明文在网络上传播 原因:如果用sql server验证在配置文件的话,用户名和密码很容易被别人看到,但是如果你用windows验证的话,用户名和密码是存储在本机windows文件的 这就很难被人发现。 二、sql server身份验证 1、强制实施密码策略 2、强制密码过期 3、用户在下次登录时必须更改密码 怎么设置:直接在sql server进行设置 如果是sql server验证的话,Persist security info 一定设置为false,这样会保证敏感信息不被暴露(如ID、密码)。 三、防止sql注入攻击: 这个注入好像是打开Min Pool Size=999999一个很大的值,来破坏数据库。 这个链接保护的方法最好是: Date Source=(local);Initial Catalog=Works;User ID=sa;Password="password01!;Pooling=true" 看到后面没有,加一个双引号。 四、在配置文件存储链接字符串: <configuration> <connectionStrings configSource="connection.config"> </configuration> 然后在connection.config里有这样的设置: <connectionStrings> <add name="AW" connectionString="server......"> </connectionStrings> 注意:connection.config属性需要设置,设置为复制到应用程序里面。不然web.config就找不到这个文件。 五、用RSA非对称加密。网上查。 六、asp.net iis注册工具(aspnet_regiis.exe) 使用加密:aspnet_regiis -pef "connectionStrings" F:\study\ComputerDM\Web 解密:aspnet_regiis -pdf "connectionStrings" F:\study\ComputerDM\Web
在C#数据库连接字符串通常包含敏感信息,如用户名、密码和服务器地址,这些信息直接写入代码可能增加安全风险。为了保护这些数据不被暴露,可以采用加密的方式来处理数据库连接字符串。 一种常见的做法是在程序运行时动态生成或管理加密后的连接字符串。这可以通过以下步骤实现: 1. **明文连接字符串**:首先,你需要将未加密的连接字符串存储在一个安全的地方,例如配置文件(`app.config`或`web.config`)的 `<connectionStrings>` 节点。 ```xml <configuration> <connectionStrings> <add name="MyDB" connectionString="Data Source=your_server;Initial Catalog=my_database;User ID=my_user;Password=my_password;" providerName="System.Data.SqlClient"/> </connectionStrings> </configuration> ``` 2. **加密**:使用C#的`System.Security.Cryptography`命名空间提供的算法(比如`AesCryptoServiceProvider`),对连接字符串进行加密。你可以选择将整个字符串加密,也可以只对敏感部分如密码加密。 ```csharp using System.Security.Cryptography; // ... string plainConnectionString = ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString; byte[] encryptedBytes = Encrypt(plainConnectionString, yourEncryptionKey); string encryptedConnectionString = Convert.ToBase64String(encryptedBytes); ``` 3. **解密**:当需要使用连接字符串时,从配置或其他安全位置获取加密字符串,然后解密。同样用相同的密钥进行解密操作。 ```csharp byte[] decryptedBytes = Decrypt(encryptedConnectionString, yourEncryptionKey); string decryptedConnectionString = Encoding.UTF8.GetString(decryptedBytes); ``` **相关问题--:** 1. C#有哪些常用的加密算法可用于连接字符串? 2. 如何在C#保存和管理加密密钥? 3. 解密过程在什么情况下可能会失败?如何处理这种情况?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值