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

 更新时间:2018年05月11日 11:31:50   作者:begrateful  
本文通过代码给大家介绍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# 数据库链接字符串加密解密工具代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • C#实现GridView导出Excel实例代码

    C#实现GridView导出Excel实例代码

    本篇文章主要介绍了C#实现GridView导出Excel实例代码,这里整理了详细的代码,非常具有实用价值,需要的朋友可以参考下。
    2017-03-03
  • C#通过反射打开相应窗体方法分享

    C#通过反射打开相应窗体方法分享

    本文章来给各位同学介绍关于C#单击菜单栏或工具栏时通过反射打开窗体的方法,有需要了解的朋友可进入参考参考。
    2015-05-05
  • C# 串口接收数据中serialPort.close()死锁的实例

    C# 串口接收数据中serialPort.close()死锁的实例

    下面小编就为大家分享一篇C# 串口接收数据中serialPort.close()死锁的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • Unity实现截屏以及根据相机画面截图

    Unity实现截屏以及根据相机画面截图

    这篇文章主要为大家详细介绍了Unity实现截屏以及根据相机画面截图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 深入浅析c#静态多态性与动态多态性

    深入浅析c#静态多态性与动态多态性

    多态就是多种形态,也就是对不同对象发送同一个消息,不同对象会做出不同的响应。这篇文章主要介绍了c#静态多态性与动态多态性的相关知识,需要的朋友可以参考下
    2018-09-09
  • C# .net core HttpClientFactory用法及说明

    C# .net core HttpClientFactory用法及说明

    这篇文章主要介绍了C# .net core HttpClientFactory用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • C# Quartzs定时器的使用教程

    C# Quartzs定时器的使用教程

    想到倒计时,定时任务,大家首先想到的肯定就是定时器,定时器在web和winfrom程序中也有着很大的作用。本文也将为大家介绍Quartzs定时器的简单使用。需要的朋友可以参考一下
    2021-11-11
  • C#实现XML文件与DataTable、Dataset互转

    C#实现XML文件与DataTable、Dataset互转

    这篇文章介绍了C#实现XML文件与DataTable、Dataset互转的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#中的lock()如何使用

    C#中的lock()如何使用

    在C#中,lock 关键字用于确保某个代码块在任何时刻只被一个线程访问,本文主要介绍了C#中的lock()如何使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 小菜编程成长记(一 面试受挫——代码无错就是好?)

    小菜编程成长记(一 面试受挫——代码无错就是好?)

    小菜编程成长记(一 面试受挫——代码无错就是好?)...
    2006-10-10

最新评论