C# 数据库链接字符串加密解密工具代码详解

有些项目尤其是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# 数据库链接字符串加密解密工具代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

时间: 2018-05-10

c#实现几种数据库的大数据批量插入

在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySQL也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解决方法. 首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summary> /// 提供数据批量处理的方法. /// </summary> public interface IBatch

C#中通过使用Connection类来实现打开/关闭数据库的代码实例

为了访问数据库,就要提供数据库连接类,在C#中,是通过Connection类来实现的 四种类型的连接方式 SQLConnection ADOConnection OractleConnection ODBCConnection 以SQLConnection方式实现数据库的连接: SQL Server数据库 windows 身份信息验证 步骤: 引用命名空间 using System.Data.SqlClient; 将连接方法声明值字符串中 创建Connection对象 调用方法 为了节省系统资源

C#实现连接SQL Server2012数据库并执行SQL语句的方法

本文实例讲述了C#实现连接SQL Server2012数据库并执行SQL语句的方法.分享给大家供大家参考,具体如下: 开发工具:Visual Studio 2012 数据库: SQL Server 2012 使用Visual Studio时还是直接和微软自家的SQL Server数据库连接比较方便,就像使用Eclipse时和MySQL连接便捷一样的道理 无论使用什么工具步骤都一样: 1. 首先保证相关工具都已经正确安装了 2. 开启数据库连接服务 3. 在开发工具中通过用户名和口令与数据库进行关

C#连接Oracle数据库使用Oracle.ManagedDataAccess.dll

在刚接触C#的时候由于公司使用的就是Oracle数据库,那么C#怎么连接Oracle数据库就成了首要去掌握的知识点了.在那时没有ODP.NET,但visual studio却对Oralce数据库的调用进行了集成,就是下图中的这个,尽管现在使用这个的时候visual studio提醒过时的,但在那时却是非常好用的. 为什么现在visual studio中这个程序集依然能使用,有ODP.NET,单单要拿出Oracle.ManagedDataAccess.dll进行本文的重点呢? 1.visual s

C#实现Excel表数据导入Sql Server数据库中的方法

本文实例讲述了C#实现Excel表数据导入Sql Server数据库中的方法.分享给大家供大家参考,具体如下: Excel表数据导入Sql Server数据库的方法很多,这里只是介绍了其中一种: 1.首先,我们要先在test数据库中新建一个my_test表,该表具有三个字段tid int类型, tname nvarchar类型, tt nvarchar类型 (注意:my_test表中的数据类型必须与Excel中相应字段的类型一致) 2. 我们用SELECT * FROM  OPENROWSET(

C#连接加密的Sqlite数据库的方法

对数据加密分两种,一种是对数据库本身进行加密,另一种是对数据表中的数据进行加密, 如果SQLite数据库加密,我这里使用的一个管理工具叫SQLiteDeveloper,如下就可以加密数据库 , 如果在工具中不提供密码的情况下打开数据库,会给你错误提示如下: , 或者在C# 使用错误的密码也会给你错误提示: System.Data.SQLite.SQLiteException:"file is encrypted or is not a database , 正确的连接方式就是在连接字符串中提供正

C#实现的ACCESS数据库操作类完整实例

本文实例讲述了C#实现的ACCESS数据库操作类.分享给大家供大家参考,具体如下: 这个是针对ACCESS数据库操作的类,同样也是从SQLHELPER提取而来,分页程序的调用可以参考MSSQL那个类的调用,差不多的,只是提取所有记录的数量的时候有多一个参数,这个需要注意一下! using System; using System.Text; using System.Collections; using System.Collections.Specialized; using System.D

C# 操作 access 数据库的实例代码

随笔: (1)   命名空间    using System.Data.OleDb; (2)   连接字符串 private staticstring connStr = @"Provider= Microsoft.Ace.OLEDB.12.0;Data Source = d:\login.accdb"; 注意: a.DataSource = 数据库存放的路径(这里数据库放到了D盘目录下)              b. 2003版本的Access数据库链接字符串: privatest

C#连接到sql server2008数据库的实例代码

废话不多说了,直接给大家贴代码了,具体代码如下所示: namespace MyFirstApp { class Program { static void Main(string[] args) { SqlConnection conn = null; SqlCommand comm = null; SqlDataReader sdreader = null; try { string ConStr = "server=192.168.1.110;uid=sa;pwd=woaifr0828;da

C#实现复制数据库 C#将A数据库数据转到B数据库

本文章以一个表为例,要转多个表则可将DataSet关联多个表,下面给出完整代码,包括引用以及main函数与复制函数. 要说明的是,必须先用Sql语句复制表结构,才能顺利的使用以下代码复制数据. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; using System.Data.C

C#使用ODBC与OLEDB连接数据库的方法示例

本文实例讲述了C#使用ODBC与OLEDB连接数据库的方法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Text; using System.Data.Odbc; using System.Data.OleDb; namespace ODBCtest { class Program { static void Main(string[] args) { //ODBC连接 string

详解C#把DataTable中数据一次插入数据库的方法

现在实际的情况是这样的: 客户有一台打卡机,员工打卡的信息全部储存在打卡机的Access数据库里面,现在客户引入了一种新的管理系统,需要将Access数据库中的打卡数据同步到SQL Server数据库中,由于时间比较久,数据积累了有40多万条. 软件功能: 选择Access数据库文件,填入目标SQL Server数据库的IP地址,然后开始进行同步. 实现方法: 1.先把Access数据库中要导入的数据存入DataTable中 配置文件中的数据库连接字符串 <connectionStrings>

C# 操作PostgreSQL 数据库的示例代码

什么是PostgreSQL? PostgreSQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS). 用于安全地存储数据; 支持最佳做法,并允许在处理请求时检索它们. PostgreSQL(也称为Post-gress-Q-L)由PostgreSQL全球开发集团(全球志愿者团队)开发. 它不受任何公司或其他私人实体控制. 它是开源的,其源代码是免费提供的. PostgreSQL是跨平台的,可以在许多操作系统上运行,如Linux,FreeBSD,OS X,Solaris和Microsoft

Java连接postgresql数据库的示例代码

本文介绍了Java连接postgresql数据库的示例代码,分享给大家,具体如下: 1.下载驱动jar 下载地址:https://jdbc.postgresql.org/download.html 2.导入jar包 新建lib文件夹,将下载的jar驱动包拖到文件夹中. 将jar驱动包添加到Libraries 3.程序代码如下:HelloWorld.java package test; import java.sql.Connection; import java.sql.DriverManage

Python操作MySQL数据库的示例代码

1. MySQL Connector 1.1 创建连接 import mysql.connector config={ "host":"localhost","port":"3306", "user":"root","password":"password", "database":"demo" } con=

Python 操作 PostgreSQL 数据库示例【连接、增删改查等】

本文实例讲述了Python 操作 PostgreSQL 数据库.分享给大家供大家参考,具体如下: 我使用的是 Python 3.7.0 PostgreSQL可以使用psycopg2模块与Python集成. sycopg2是用于Python编程语言的PostgreSQL数据库适配器. psycopg2是非常小,快速,稳定的. 您不需要单独安装此模块,因为默认情况下它会随着Python 2.5.x版本一起发布. pip3 install python-psycopg2 pip3 install ps

PHP连接及操作PostgreSQL数据库的方法详解

本文实例讲述了PHP连接及操作PostgreSQL数据库的方法.分享给大家供大家参考,具体如下: PostgreSQL扩展在默认情况下在最新版本的PHP 5.3.x中是启用的. 可以在编译时使用--without-pgsql来禁用它.仍然可以使用yum命令来安装PHP-PostgreSQL接口: yum install php-pgsql 在开始使用PHP连接PostgreSQL接口之前,请先在PostgreSQL安装目录中找到pg_hba.conf文件,并添加以下行: # IPv4 local

php连接与操作PostgreSQL数据库的方法

本文实例讲述了php连接与操作PostgreSQL数据库的方法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: $pg=@pg_connect("host=localhost user=postgres password=sa dbname=employes") or die("can't connect to database."); $query="select * from employes order by serial_no&q

ASP.NET操作MySql数据库的实例代码讲解

一.把MySql.Data.dll放到BIN目录下. 二.这是aspx.cs的全部源码,修改参数直接运行即可!   using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; publ

在golang中操作mysql数据库的实现代码

前言 Golang 提供了database/sql包用于对SQL数据库的访问, 作为操作数据库的入口对象sql.DB, 主要为我们提供了两个重要的功能: •sql.DB 通过数据库驱动为我们提供管理底层数据库连接的打开和关闭操作. •sql.DB 为我们管理数据库连接池 需要注意的是,sql.DB表示操作数据库的抽象访问接口,而非一个数据库连接对象;它可以根据driver打开关闭数据库连接,管理连接池.正在使用的连接被标记为繁忙,用完后回到连接池等待下次使用.所以,如果你没有把连接释放回连接池,

python读取word文档,插入mysql数据库的示例代码

表格内容如下: 1.实现批量导入word文档,取文档标题中的数字作为编号 2.除取上面打钩的内容需要匹配出来入库入库,其他内容全部直接入库mysql # wuyanfeng # -*- coding:utf-8 -*- # 读取docx中的文本代码示例 import docx import pymysql import re import os # 创建数据库链接 conn = pymysql.connect( host='rm-bp1vu5d84dg12c6d59o.mysql.rds.ali