http://www.tuicool.com/articles/QvYbEn

一.EF,CodeFirst加密SQL连接符

public LifeHelpContext() : base("SQLConnectionString")
{ } public LifeHelpContext(string sql =@"DataSource=.;UserID=sa;Password=123456;InitialCatalog=TestDb;MultipleActiveResultSets=True;") : base(sql) //当sql省略时的时候,给定一个数据库连接字符串
{ }
LifeHelpContext继承的是 DbContext ,public LifeHelpContext() : base("SQLConnectionString"),可以是App.Config或(Web.config) 里的数据库连接字符串 Name值等。 数据库连接字符串: connectionString="Data Source=.;User ID=sa;Password=123456;Initial Catalog=TestDb;MultipleActiveResultSets=True;" /> <connectionStrings>
<add name="SQLConnectionString" providerName="System.Data.SqlClient"
connectionString="Data Source=.;User ID=sa;Password=123456;Initial Catalog=TestDb;MultipleActiveResultSets=True;" />
<add name="TestSQLConnection" providerName="System.Data.SqlClient"
connectionString="Data Source=.;User ID=sa;Password=123456;Initial Catalog=TestDb2;MultipleActiveResultSets=True;" />
</connectionStrings>
可以配置同一类型数据库不同地址,比如开发版、测试版等,也可以配置多数据库类型(EF支持的数据库(MSSQL、Oracle等)。也可以直接写 数据库连接,直接写数据库方便加密连接。 二.加密算法 2.1 加密用的是DES加密 为什么用DES? 一.DES是安全性比较高的一种算法,目前只有一种方法可以破解该算法,那就是穷举法. 二.采用64位密钥技术,实际只有56位有效,8位用来校验的.譬如,有这样的一台PC机器,它能每秒计算一百万次,那么256位空间它要穷举的时间为2285年.所以这种算法还是比较安全的一种算法. _iv = "67^%*(&(*Ghx7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk"; //iv 向量
/// <summary>
/// 加密文本
/// </summary>
/// <param name="encryptoContext"></param>
/// <param name="cryptoKey"></param>
/// <returns></returns>
public string EncryptContext(string encryptoContext, string cryptoKey)
{
//取 8 位 key
cryptoKey = cryptoKey.PadLeft(8, '').Substring(0, 8);
//设置加密的 key,其值来自参数
byte[] key = Encoding.UTF8.GetBytes(cryptoKey);
//设置加密的 iv 向量,这里使用硬编码演示
byte[] iv = Encoding.UTF8.GetBytes(_iv);
//将需要加密的正文放进 byte 数组
byte[] context = Encoding.UTF8.GetBytes(encryptoContext);
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, iv), CryptoStreamMode.Write))
{
cs.Write(context, 0, context.Length);
//将缓冲区数据写入,然后清空缓冲区
cs.FlushFinalBlock();
}
//从内存流返回结果,并编码为 base64string
return Convert.ToBase64String(ms.ToArray());
}
}
} 2.2 解密部分 /// <summary>
/// 解密文本
/// </summary>
/// <param name="decryptoContext"></param>
/// <returns></returns>
public string DecryptContext(string decryptoContext, string cryptoKey)
{
//取 8 位 key
cryptoKey = cryptoKey.PadLeft(8, '').Substring(0, 8);
//设置解密的 key,其值来自参数
byte[] key = Encoding.UTF8.GetBytes(cryptoKey);
//设置解密的 iv 向量,这里使用硬编码演示
byte[] iv = Encoding.UTF8.GetBytes(_iv);
//将解密正文返回到 byte 数组,加密时编码为 base64string ,这里要使用 FromBase64String 直接取回 byte 数组
byte[] context = Convert.FromBase64String(decryptoContext);
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(key, iv), CryptoStreamMode.Write))
{
cs.Write(context, 0, context.Length);
//将当前缓冲区写入绑定的内存流,然后清空缓冲区
cs.FlushFinalBlock();
}
//从内存流返回值,并编码到 UTF8 输出原文
return Encoding.UTF8.GetString(ms.ToArray());
}
}
} 2.3 业务层,定义基类调用解密经过加密过的数据连接字符串 public class BllBase
{
protected readonly LifeHelpContext Dal;
protected BllBase()
{
FileEncrypt fileEncrypt = new FileEncrypt();
string trConnection = ConfigurationManager.ConnectionStrings["SQLConnectionString"].ConnectionString;
if (fileEncrypt.SqlConnectionIsEncrypted(trConnection,"19880125"))
{
trConnection = fileEncrypt.DecryptContext(trConnection);
}
Dal = new LifeHelpContext(trConnection);
}
}
/// <summary>
/// 验证是否符合指定的连接字符串格式
/// </summary>
/// <param name="content"></param>
/// <returns></returns>
public bool SqlConnectionIsEncrypted(string content)
{
Regex regex = new Regex(@"Data Source=(\S+);User ID=(\S+);Password=(\S+);Initial Catalog=(.+)");
return !regex.IsMatch(content);
}

一.EF,CodeFirst加密SQL连接符

public LifeHelpContext() : base("SQLConnectionString")
{ } public LifeHelpContext(string sql =@"DataSource=.;UserID=sa;Password=123456;InitialCatalog=TestDb;MultipleActiveResultSets=True;") : base(sql) //当sql省略时的时候,给定一个数据库连接字符串
{ }

LifeHelpContext继承的是 DbContext ,public LifeHelpContext() : base("SQLConnectionString"),可以是App.Config或(Web.config) 里的数据库连接字符串 Name值等。

数据库连接字符串:

connectionString="Data Source=.;User ID=sa;Password=123456;Initial Catalog=TestDb;MultipleActiveResultSets=True;" />

<connectionStrings>
<add name="SQLConnectionString" providerName="System.Data.SqlClient"
connectionString="Data Source=.;User ID=sa;Password=123456;Initial Catalog=TestDb;MultipleActiveResultSets=True;" />
<add name="TestSQLConnection" providerName="System.Data.SqlClient"
connectionString="Data Source=.;User ID=sa;Password=123456;Initial Catalog=TestDb2;MultipleActiveResultSets=True;" />
</connectionStrings>

可以配置同一类型数据库不同地址,比如开发版、测试版等,也可以配置多数据库类型(EF支持的数据库(MSSQL、Oracle等)。也可以直接写 数据库连接,直接写数据库方便加密连接。

二.加密算法

2.1 加密用的是DES加密

为什么用DES?

一.DES是安全性比较高的一种算法,目前只有一种方法可以破解该算法,那就是穷举法.

二.采用64位密钥技术,实际只有56位有效,8位用来校验的.譬如,有这样的一台PC机器,它能每秒计算一百万次,那么256位空间它要穷举的时间为2285年.所以这种算法还是比较安全的一种算法.

_iv = "67^%*(&(*Ghx7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk"; //iv 向量
/// <summary>
/// 加密文本
/// </summary>
/// <param name="encryptoContext"></param>
/// <param name="cryptoKey"></param>
/// <returns></returns>
public string EncryptContext(string encryptoContext, string cryptoKey)
{
//取 8 位 key
cryptoKey = cryptoKey.PadLeft(8, '0').Substring(0, 8);
//设置加密的 key,其值来自参数
byte[] key = Encoding.UTF8.GetBytes(cryptoKey);
//设置加密的 iv 向量,这里使用硬编码演示
byte[] iv = Encoding.UTF8.GetBytes(_iv);
//将需要加密的正文放进 byte 数组
byte[] context = Encoding.UTF8.GetBytes(encryptoContext);
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, iv), CryptoStreamMode.Write))
{
cs.Write(context, 0, context.Length);
//将缓冲区数据写入,然后清空缓冲区
cs.FlushFinalBlock();
}
//从内存流返回结果,并编码为 base64string
return Convert.ToBase64String(ms.ToArray());
}
}
}

2.2 解密部分

/// <summary>
/// 解密文本
/// </summary>
/// <param name="decryptoContext"></param>
/// <returns></returns>
public string DecryptContext(string decryptoContext, string cryptoKey)
{
//取 8 位 key
cryptoKey = cryptoKey.PadLeft(8, '0').Substring(0, 8);
//设置解密的 key,其值来自参数
byte[] key = Encoding.UTF8.GetBytes(cryptoKey);
//设置解密的 iv 向量,这里使用硬编码演示
byte[] iv = Encoding.UTF8.GetBytes(_iv);
//将解密正文返回到 byte 数组,加密时编码为 base64string ,这里要使用 FromBase64String 直接取回 byte 数组
byte[] context = Convert.FromBase64String(decryptoContext);
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(key, iv), CryptoStreamMode.Write))
{
cs.Write(context, 0, context.Length);
//将当前缓冲区写入绑定的内存流,然后清空缓冲区
cs.FlushFinalBlock();
}
//从内存流返回值,并编码到 UTF8 输出原文
return Encoding.UTF8.GetString(ms.ToArray());
}
}
}

2.3 业务层,定义基类调用解密经过加密过的数据连接字符串

public class BllBase
{
protected readonly LifeHelpContext Dal;
protected BllBase()
{
FileEncrypt fileEncrypt = new FileEncrypt();
string trConnection = ConfigurationManager.ConnectionStrings["SQLConnectionString"].ConnectionString;
if (fileEncrypt.SqlConnectionIsEncrypted(trConnection,"19880125"))
{
trConnection = fileEncrypt.DecryptContext(trConnection);
}
Dal = new LifeHelpContext(trConnection);
}
}
/// <summary>
/// 验证是否符合指定的连接字符串格式
/// </summary>
/// <param name="content"></param>
/// <returns></returns>
public bool SqlConnectionIsEncrypted(string content)
{
Regex regex = new Regex(@"Data Source=(\S+);User ID=(\S+);Password=(\S+);Initial Catalog=(.+)");
return !regex.IsMatch(content);
}

EF--Codefirst 加密数据库连接字符串的更多相关文章

  1. Enterprise Library 中加密数据库连接字符串

    看了SHY520写的关于Data Access Application Block的文章,写得不错,忽略了一点就是如何去加密数据库连接字符串,这儿我简单的介绍一下.我们知道,在Enterprise L ...

  2. Winform RsaProtectedConfigurationProvider 加密数据库连接字符串

    private static string _strProvider = "RsaProtectedConfigurationProvider"; /// <summary& ...

  3. 创建自己的RSA密钥来保护web.config 加密数据库连接字符串

    通过创建自己的RSA密钥来保护web.config1创建RSA密钥:C:\Windows\Microsoft.NET\Framework64\v4.0.30319>aspnet_regiis - ...

  4. web config数据库连接字符串加密

    ASP.NET web.config中,数据库连接字符串的加密与解密 ASP.NET web.config中,数据库连接字符串的加密与解密. 开始--->运行,输入cmd,接着输入以下内容 加密 ...

  5. JavaScript日历控件开发 C# 读取 appconfig文件配置数据库连接字符串,和配置文件 List<T>.ForEach 调用异步方法的意外 ef 增加或者更新的习惯思维 asp.net core导入excel 一个二级联动

    JavaScript日历控件开发   概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果代码地址:https://github.com/aspwebc ...

  6. 关于IBatisNet的配置文件中数据库连接字符串加密处理

    我们通常在IBatisNet配置文件 properties.config 加入数据库连接字符串.数据库连接字符串直接放在里面,没有被加密,很不安全.如果我们把 properties.config 文件 ...

  7. ASP.NET数据库连接字符串的加密与解密

    ASP.NET web.config中,数据库连接字符串的加密与解密. 虽然不怎么新鲜,但相信还是有许多人不知道,好,不说废话,直接给方法:开始--->运行,输入cmd,接着输入以下内容 加密: ...

  8. asp.net web.config数据库连接字符串加密与解密

    在WEB网站开发过程中,如果我们将数据库连接字符串封装到.DLL文件中,将会给数据库和程序的迁移带来麻烦,因为万一服务器地址或者数据库发生变更,那么我们就不得不修改源程序并重新将其编译.最好的解决方法 ...

  9. ASP.NET加密和解密数据库连接字符串

    大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作.当有人想要获取你程序中的数据库信息,他首先看到的可能会是We ...

随机推荐

  1. nginx配置实战1----配置虚拟主机

    1 nginx虚拟主机的概念 虚拟主机是在网络服务器上划分出一定的磁盘空间供用户放置站点.应用组件等,提供必要的站点功能.数据存放和传输功能,所谓虚拟主机,也叫"网站空间",就是把 ...

  2. 安装centos虚拟机

    启动虚拟机提示"无法连接虚拟设备ide1:0,主机上没有相对应的设备" 进入编辑虚拟机设置--选中硬盘--点高级--在 虚拟机设备节点中选ide0:0接行了.

  3. 【USACO 1.4】Arithmetic Progressions

    /* TASK: ariprog LANG:C++ URL:http://train.usaco.org/usacoprob2?a=PA9lOcZrdWq&S=ariprog SOLVE:平方 ...

  4. 项目实例——多表关联查询判断A的字段是否在B中,在显示该字段值,不在显示空;B的字段是否在C中,在显示该字段值,不在显示空。

    1.需求: (1)三张表A.B.C  三个表id相同,如果A表中的name在B表中的bname中显示aname值,否则显示空:如果C表中的addr在B表中的tel显示addr,否则显示空 2.实现方式 ...

  5. BZOJ 1142: [POI2009]Tab

    1142: [POI2009]Tab Time Limit: 40 Sec  Memory Limit: 162 MBSubmit: 213  Solved: 80[Submit][Status][D ...

  6. 【poj1160】 Post Office

    http://poj.org/problem?id=1160 (题目链接) 题意 按照递增顺序给出一条直线上坐标互不相同的n个村庄,要求从中选择p个村庄建立邮局,每个村庄使用离它最近的那个邮局,使得所 ...

  7. CCNET+ProGet+Windows Batch搭建全自动的内部包打包和推送及管理平台

    所要用的工具: 1.CCNET(用于检测SVN有改动提交时自动构建,并运行nuget的自动打包和推送批处理) 2.ProGet(目前见到最好用的nuget内部包管理平台) 3.Windows Batc ...

  8. hdu 4609 FFT

    题意:给出一堆数,问从这些数中取3个能组成三角形的概率? sol:其实就是问从这些数里取3个组成三角形有多少种取法 脑洞大开的解法:用FFT 设一开始的数是1 3 3 4 作一个向量x,其中x[i]= ...

  9. C#做窗体皮肤

    网上有很好的皮肤控件 SkinEnigne可供使用: 具体步骤: 添加控件SkinEngine. 1.右键“工具箱”.“添加选项卡”,取名“皮肤”. 2.右键“皮肤”,“选择项”弹出对话框. 3.点击 ...

  10. linux系统安装配置

    以中文拼音输入法为例:1.sudo apt install ibus-pinyin2.sudo apt install ibus-libpinyin3.注销重新登录 或则 重启计算机4.进入输入设置, ...