有些项目尤其是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. Android 6.0 运行时权限处理问题

    序 自从升级到Android M以来,最大的改变就是增加了运行时权限RuntimePermission,6.0以上的系统如果没有做适配,运行了targetSDK=23的App时就会报权限错误.我们知道 ...

  2. Android 官方命令深入分析之Android Debug Bridge(adb)

    作者:宋志辉 Android Debug Brideg(adb)是一个多用途的命令行工具.可以与Android虚拟机进行通信或连接真机.它同样提供了访问设备shell的高级命令行操作的权限.它是一个包 ...

  3. android TabLayout实现京东详情效果

    Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个supp ...

  4. SpriteBuilder中应用智能精灵集之后提示找不到文件的解决

    SpriteBuilder中有一个将方便的功能,可以用文件夹中的若干图片生成1张图片;这称之为智能精灵集合(smart sprite sheet).好处是可以一次性的加载图片到显存中去,提升了性能. ...

  5. 开源项目管理系统:ProjectForge

    ProjectForge是一个Java编写的开源的基于Web的项目管理解决方案.包括:工时表(Timesheet).费用管理.项目甘特图,控制和管理工程分解结构.集成JiRA做为问题管理系统. 使用的 ...

  6. C语言所有作业练习题

    2015.08.11 1.计算十进制 42 转换为二进制.八进制.十六进制分别对应的值 2.计算二进制 11010110 对应的十进制值 3.计算八进制 075 对应的十进制值 4.计算十六进制 0x ...

  7. Errors running builder 'Integrated External Tool Builder' on project xxx

    出现这样的提示,表明你的项目的Builder项出了问题. 解决方法是: 右键项目选择"Properties",再选择"Builders",删除丢失的builde ...

  8. 【Coding算法导论】第4章:最大子数组问题

    Coding算法导论 本系列文章主要针对算法导论一书上的算法,将书中的伪代码用C++实现 代码未经过大量数据测试,如有问题,希望能在回复中指出! (一)问题描述 给定一个数组,求数组中连续的子数组的和 ...

  9. ubuntu virtualbox xp无声音解决

    太简单了,记录一下解决方法,进入xp,打开设备管理器,对着ac97设备驱动 点右键,点更新驱动,更新一下就ok了. 这时候去控制面板,就可以看到有音频设备了. 具体步骤如下: 第一步,virtualb ...

  10. 我所理解的Android 启动模式

    首先,这是从 一个开源网站转载的,觉得写得不错,对我们之前理解的activity的启动模式是一个新的理解方式,并给出实际的应用场景. 任务栈是什么 任务栈Task,是一种用来放置Activity实例的 ...