有些项目尤其是WinForm或者是WPF项目,针对一些工具形式的小项目,不想软件流出去之后,懂程序的的拿到手之后一看配置文件就知道了我们数据库的用户名和密码,如果外网能访问的话,那就麻烦大了。所以这里为了防止项目外泄之后这些信息不被别人看到,我们就需要对链接字符串或者其他重要信息进行加密,用的时候在解密。

思路:使用两个数对连接字符串进行加密,再用这两个数进行解密。

    <add key="ConfigString" value="4HsXBRNXTkeN0ZoKdEwFE501TKSqLZUyJ0Zf+C7s5+gPd1SbWBiuh4PG6jeFgcnCTFr0QFW8FN40m/S8xmQq+8srL8taMLO23z6GSmaQJoM="/>

  

直接上代码:

1:定义一个初始化源数据的类。

    public class ConfigInformation
{
private static ConfigInformation _configInformation; public ConfigInformation Instance
{
get
{
if (_configInformation == null)
{
_configInformation = new ConfigInformation();
}
return _configInformation;
}
}
// 数据库链接字符串加解密 Key Value
public static String Key = "27e167e9-2660-4bc1-bea0-c8781a9f01cb";
public static String Vector = "8280d587-f9bf-4127-bbfa-5e0b4b672958"; }

  

2:加解密方法:

    /// <summary>
/// 加密 解密
/// </summary>
public class DecryptAndEncryptionHelper
{
private readonly SymmetricAlgorithm _symmetricAlgorithm;
private const String DefKey = "qazwsxedcrfvtgb!@#$%^&*(tgbrfvedcwsxqaz)(*&^%$#@!";
private String _key = "";
public String Key
{
get { return _key; }
set
{
if (!String.IsNullOrEmpty(value))
{
_key = value;
}
else
{
_key = DefKey;
}
}
} private const String DefIV = "tgbrfvedcwsxqaz)(*&^%$#@!qazwsxedcrfvtgb!@#$%^&*(";
private String _iv = "";
public String IV
{
get { return _iv; }
set
{
if (!String.IsNullOrEmpty(value))
{
_iv = value;
}
else
{
_iv = DefIV;
}
}
}
public DecryptAndEncryptionHelper()
{
_symmetricAlgorithm = new RijndaelManaged();
} public DecryptAndEncryptionHelper(String Key, String IV)
{
_symmetricAlgorithm = new RijndaelManaged();
_key = String.IsNullOrEmpty(Key) ? DefKey : Key;
_iv = String.IsNullOrEmpty(IV) ? DefIV : IV;
}
/// <summary>
/// Get Key
/// </summary>
/// <returns>密钥</returns>
private byte[] GetLegalKey()
{
_symmetricAlgorithm.GenerateKey();
byte[] bytTemp = _symmetricAlgorithm.Key;
int KeyLength = bytTemp.Length;
if (_key.Length > KeyLength)
_key = _key.Substring(0, KeyLength);
else if (_key.Length < KeyLength)
_key = _key.PadRight(KeyLength, '#');
return ASCIIEncoding.ASCII.GetBytes(_key);
} /// <summary>
/// Get IV
/// </summary>
private byte[] GetLegalIV()
{
_symmetricAlgorithm.GenerateIV();
byte[] bytTemp = _symmetricAlgorithm.IV;
int IVLength = bytTemp.Length;
if (_iv.Length > IVLength)
_iv = _iv.Substring(0, IVLength);
else if (_iv.Length < IVLength)
_iv = _iv.PadRight(IVLength, '#');
return ASCIIEncoding.ASCII.GetBytes(_iv);
} /// <summary>
/// Encrypto 加密
/// </summary>
public string Encrypto(string Source)
{
byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
MemoryStream ms = new MemoryStream();
_symmetricAlgorithm.Key = GetLegalKey();
_symmetricAlgorithm.IV = GetLegalIV();
ICryptoTransform encrypto = _symmetricAlgorithm.CreateEncryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
cs.Write(bytIn, 0, bytIn.Length);
cs.FlushFinalBlock();
ms.Close();
byte[] bytOut = ms.ToArray();
return Convert.ToBase64String(bytOut);
} /// <summary>
/// Decrypto 解密
/// </summary>
public string Decrypto(string Source)
{
byte[] bytIn = Convert.FromBase64String(Source);
MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
_symmetricAlgorithm.Key = GetLegalKey();
_symmetricAlgorithm.IV = GetLegalIV();
ICryptoTransform encrypto = _symmetricAlgorithm.CreateDecryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cs);
return sr.ReadToEnd();
}
}

  3:使用

// 获取加密的链接字符串,然后解密
string enString = ConfigurationManager.AppSettings["ConfigString"];
DecryptAndEncryptionHelper helper = new DecryptAndEncryptionHelper(ConfigInformation.Key, ConfigInformation.Vector); // 明文
var configStr = helper.Decrypto(enString);
return configStr;

  

这样至少保证了数据的不外泄。

注意:这个加密和解密的算法方法,应该放在服务器。通过请求加解密方法。不应该放在本地代码里,技术牛的的人,把你的项目反编译一样可以看到源代码。

 我们在把加密源数据找出来。

所以这个加解密代码不能写在本地,必须部署到安全的服务器上。

C# 数据库链接字符串加密工具的更多相关文章

  1. EF实体实现链接字符串加密

    1.加密解密方法 using System;using System.Security.Cryptography; using System.Text;namespace DBUtility{ /// ...

  2. sqlserver,sqlite,access数据库链接字符串

    SqlServer:string connection = "server=32.1.1.48;database=数据库名;user=sa;password=sa2008"; ac ...

  3. SqlServer数据库链接字符串

    完整链接字符串: 1."DataSourse=.\你的实例;Initial Catalog=yourdatabase;User ID=*;Password=*;Trusted_Connect ...

  4. Sql Server数据库链接字符串参数说明

               DataSource,//要连接到的 SQL Server 实例的名称或网络地址              FailoverPartner,//在主服务器停机时要连接到的伙伴服务 ...

  5. MSSQL数据库链接字符串Asynchronous Processing=true不是异步查询吗,怎么是缓存

    ;Asynchronous Processing=true  不是异步查询吗,怎么是缓存 <!--<add name="default" providerName=&q ...

  6. asp.net--常用的数据库链接字符串

    本地连接 privatestring conn_string ="Data Source=localhost;Initial Catalog=SQLtest;Integrated Secur ...

  7. kettle与各数据库建立链接的链接字符串

    kettle与各数据库建立链接的链接字符串 Sybase: TO_DB_URL = jdbc:sybase:Tds:192.168.168.163:5000/testdb?charset=eucgb& ...

  8. 【转】Encrypt ConnectionString in Web.Config 【加密ASP.NET web.config数据库链接字串】

    原文链接:https://www.codeproject.com/Tips/795135/Encrypt-ConnectionString-in-Web-Config web.config中一般会存放 ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(62)-EF链接串加密

    系列目录 前言: 这一节提供一个简单的功能,这个功能看似简单,找了一下没找到EF链接数据库串的加密帮助文档,只能自己写了,这样也更加符合自己的加密要求 有时候我们发布程序为了避免程序外的SQL链接串明 ...

随机推荐

  1. 04-GIT TortoiseGit冲突和补丁演示 案例演示

    TortoiseGit安装下载 http://download.tortoisegit.org/tgit/1.8.12.0/ 或https://code.google.com/p/tortoisegi ...

  2. Linux IPC实践(6) --System V消息队列(3)

    消息队列综合案例 消息队列实现回射客户/服务器   server进程接收时, 指定msgtyp为0, 从队首不断接收消息 server进程发送时, 将mtype指定为接收到的client进程的pid ...

  3. [Django高级]理解django中的中间件机制和执行顺序

    原文来自 Understanding Django Middlewares, 这篇文章从整体上介绍了django中中间件定义,作用,和怎么样自己写中间件 –orangleliu. 注:middlewa ...

  4. 索引构建情况分析、mongoDB安全(四)

    索引好处:加快索引相关的查询 坏处:增加磁盘空间消耗,降低写入性能 评判当前索引构建情况:     1. mongostat工具介绍     2. profile集合介绍     3. 日志介绍   ...

  5. 【Unity Shaders】Diffuse Shading——漫反射光照改善技巧

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  6. 服务端技术进阶(一)web项目的部署(发布)流程

    web项目的部署(发布)流程 在myeclipse下新建web工程abc.系统设置默认如下: 项目保存位置:workspace目录\abc.Source文件夹:src,保存所有的java类文件(.ja ...

  7. R-- Dplyr包

    Dplyr 包应用 1. 筛选 filter() 按照给定的逻辑判断选择出合适的数据子集 fliter(data,year==2015,month==1) 支持对同一对象的任意条件组合 fliter( ...

  8. Android学习之旅-android系统服务的启动过程以及分类(90)

    读了android开发精要这本书,所以我把书中的比较精彩的地方截图了,一块分享一下

  9. 算法面试题-leetcode学习之旅(二)

    题目: Given a non-negative integer num, repeatedly add all its digits until the result has only one di ...

  10. 【1】mac下面iTerm配置oh-my-zsh教程

    1.安装iterm 地址如下: http://iterm2.com/ 2.安装oh-my-zsh 打开iterm输入如下命令: sh -c "$(curl -fsSL https://raw ...