野鸭鸭

加密.NET程序的数据库连接字符串

.NET程序中将数据库连接字符串保存在Config文件中,是一种基础常见的作法。但是这种将数据库连接字符串明文保存在文件中的做法,安全性较低,不太适合作为企业环境。

明文连接字符串

.NET程序中,Web应用通常将数据库连接字符串保存在Web.Config文件中,桌面应用程序则是App.Config文件,并且通常是使用明文的方式进行记录的。因为使用明文进行记录,一旦信息泄露,等于直接将数据库暴露在外,安全性很低。

相对于Web应用仅将配置文件保存在服务器,ClickOnce发布的桌面应用程序,因为会本客户端本地保存App.Config文件,其安全性问题更加突出。

为此,我专门测试过在公司内部部署了一个ClickOnce发布的ERP辅助程序。经过网上查询,在程序的安装目录中,可以直接通过App.Config文件,查看到配置的数据库配置信息。稍微掌握程序开发和数据库知识,即可通过这种方式,直接获取到数据库的地址和账号密码,非常危险。

加密连接字符串

发现这个问题之后,我把加密连接字符串的工作提到最紧急列表中。通过网络搜索,大概了解到了常见的字符串加密有对称加密和非对称加密两种,其中DES方式是代表性的对称加密,而RSA方式则是非对称加密的代表方式,且DES相对简单。

暂时挑战不起RSA,于是搜索了DES的加密范例程序,进行抄袭和借鉴。基本思路是,先通过程序,加密原来的连接字符串,然后替换App.Config文件中原来的明文连接字符串,然后在程序运行时,对其进行解密,这样就实现了最基本的加密。

基本的DES加密和解密操作,比较简单,网上的范例程序可以快速理解其中的操作步骤。唯一的注意点是,DES加密使用的密钥,必须是8位的。

加密代码

public static string DESEncrypt(string encryptingData,string key)
{
    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
    des.Key = ASCIIEncoding.ASCII.GetBytes(key);
    des.IV = ASCIIEncoding.ASCII.GetBytes(key);
    byte[] encryptingBytes = Encoding.Default.GetBytes(encryptingData);
    MemoryStream ms = new MemoryStream();
    CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
    cs.Write(encryptingBytes, 0, encryptingBytes.Length);
    cs.FlushFinalBlock();
    StringBuilder sb = new StringBuilder();
    foreach (byte b in ms.ToArray())
    {
        sb.AppendFormat("{0:X2}", b);
    }
    return sb.ToString();
}

解密代码

public static string DESDecrypt(string decryptingData,string key)
{
    byte[] decryptingBytes = new byte[decryptingData.Length / 2];
    for (int i = 0; i < decryptingBytes.Length; i++)
    {
        int data = (Convert.ToInt32(decryptingData.Substring(i * 2, 2), 16));
        decryptingBytes[i] = (byte)data;
    }
    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
    des.Key = ASCIIEncoding.ASCII.GetBytes(key);
    des.IV = ASCIIEncoding.ASCII.GetBytes(key);
    MemoryStream ms = new MemoryStream();
    CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
    cs.Write(decryptingBytes, 0, decryptingBytes.Length);
    cs.FlushFinalBlock();
    StringBuilder sb = new StringBuilder();
    return Encoding.Default.GetString(ms.ToArray());           
}

ClickOnce缓存

我测试后发现,应用连接字符串加密发布程序,客户端更新后,旧版本的配置文件,仍然保存在本地文件夹中。于是又重新发布了一次,再次更新,此后,本地原来的明文配置文件才彻底消失。

我猜想,可能是ClickOnce会自动保存当前最新版本和上一个版本,以备程序退回时使用,所以导致更新后依然保存之前的历史版本。不过根加密数据库连接字符串没啥关系。

里予甲鸟甲鸟

我有钱,我高大,我帅气,我还没睡醒!谁叫醒我,就打谁哦。

添加评论

联系

即刻M我/Q我