EncrptyHelper

本文介绍了一种用于数据库连接设置的加密与管理方法,通过使用DES加密算法对数据库配置进行加密,确保了数据库连接信息的安全。同时,提供了加载、生成加密设置字符串的功能,并实现了设置项的获取与应用。
    public class EncryptHelper {

        public const string ENCRYPT_KEY = "FLEX-SQL";
        public const string ENCRYPT_IV = "VER2.0.1";
        public const string SPLITTER = " = ";

        public static readonly Encoding ENCRYPT_ENCODING = Encoding.UTF8;

        private Dictionary<String, DbItem> _Settings = new Dictionary<string, DbItem>();

        /// <summary>
        /// Get Db setting item.
        /// </summary>
        /// <param name="settingName">Setting name</param>
        /// <returns>Db setting item</returns>
        public DbItem GetItem(string settingName) {
            if (_Settings.ContainsKey(settingName))
                return _Settings[settingName];

            throw new DbSettingException(TextResource.DbItemNotExists, settingName);
        }

        /// <summary>
        /// Get the settings.
        /// </summary>
        public List<String> Settings {
            get {
                return _Settings.Keys.ToList();
            }
        }

        public void ApplySetting(string settingName, string server, string account, string password, string database, int connTimeout) {

            #region Argument Validation

            if (String.IsNullOrEmpty(settingName))
                throw new ArgumentNullException("settingName");

            if (String.IsNullOrEmpty(server))
                throw new ArgumentNullException("server");

            if (String.IsNullOrEmpty(account))
                throw new ArgumentNullException("account");

            if (String.IsNullOrEmpty(password))
                throw new ArgumentNullException("password");

            if (String.IsNullOrEmpty(database))
                throw new ArgumentNullException("database");

            if (connTimeout < 0)
                throw new ArgumentOutOfRangeException("connTimeout");

            #endregion

            if (_Settings.ContainsKey(settingName)) {
                DbItem item = _Settings[settingName];

                item.Server = server;
                item.Account = account;
                item.Password = password;
                item.Database = database;
                item.ConnectionTimeout = connTimeout;
            } else {
                DbItem item = new DbItem();

                item.Server = server;
                item.Account = account;
                item.Password = password;
                item.Database = database;
                item.ConnectionTimeout = connTimeout;

                _Settings.Add(settingName, item);
            }
        }

        #region Load DbSetting from setting string

        /// <summary>
        /// Load DbSetting.
        /// </summary>
        /// <param name="settingString">Setting string</param>
        public static DbSetting Load(string settingString) {
            // New instance
            DbSetting db = new DbSetting();

            if (String.IsNullOrEmpty(settingString))
                return db;

            string[] settingArr = settingString.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
            if (settingArr.Length < 1)
                return db;

            foreach (string settingItem in settingArr) {
                string[] arr = settingItem.Split(new string[] { SPLITTER }, StringSplitOptions.RemoveEmptyEntries);
                if (arr.Length != 2)
                    continue;

                string itemName = arr[0].Trim();
                string itemString = arr[1].Trim();
                // Decrypt Db setting item
                DbItem item = Decrypt(itemString);

                // Replace exists item with the same key.
                if (db._Settings.ContainsKey(itemName))
                    db._Settings[itemName] = item;

                // Add to settings
                db._Settings.Add(itemName, item);
            }

            return db;
        }

        #endregion

        #region Generate DbSetting string

        /// <summary>
        /// Generate DbSetting encrypted string.
        /// </summary>
        /// <returns>DbSetting string</returns>
        public override string ToString() {
            if (_Settings.Count < 1)
                throw new DbSettingException(TextResource.EmptyDbSetting);

            // Setting string
            StringBuilder settingString = new StringBuilder();

            foreach (KeyValuePair<String, DbItem> pair in _Settings) {
                string itemName = pair.Key;
                DbItem item = pair.Value;

                // Get encrypt item string.
                string itemString = Encrypt(item);
                // Add to String builder.
                settingString.AppendFormat("{0}{1}{2};{3}", itemName, SPLITTER, itemString, Environment.NewLine);
            }

            return settingString.ToString();
        }

        #endregion

        #region Encrypt & Decrypt

        private static string Encrypt(DbItem item) {
            if (item == null)
                throw new ArgumentNullException("item");

            // Get Db setting item string.
            string itemString = item.ToString();
            // return Encrypt result.
            return DESEncrypt(itemString);
        }

        private static DbItem Decrypt(string encryptString) {
            if (String.IsNullOrEmpty(encryptString))
                throw new ArgumentNullException("encryptString");

            // Descrypt Db setting item string.
            string itemString = DESDecrypt(encryptString);
            // Return Db setting item
            return DbItem.FromString(itemString);
        }

        #region String Encrypt & Decrypt

        /// <summary>
        /// 字符串加密
        /// </summary>
        /// <param name="target">待加密的字符串</param>
        /// <returns>加密后的字符串</returns>
        private static string DESEncrypt(String target) {
            if (String.IsNullOrEmpty(target))
                return String.Empty;

            SymmetricAlgorithm cryptAlgorithm = new DESCryptoServiceProvider();
            cryptAlgorithm.Key = ENCRYPT_ENCODING.GetBytes(ENCRYPT_KEY);
            cryptAlgorithm.IV = ENCRYPT_ENCODING.GetBytes(ENCRYPT_IV);

            ICryptoTransform cryptor = cryptAlgorithm.CreateEncryptor();
            byte[] targetBytes = ENCRYPT_ENCODING.GetBytes(target);

            using (MemoryStream ms = new MemoryStream()) {
                using (CryptoStream cs = new CryptoStream(ms, cryptor, CryptoStreamMode.Write)) {
                    cs.Write(targetBytes, 0, targetBytes.Length);
                    cs.FlushFinalBlock();
                }

                return Convert.ToBase64String(ms.ToArray(), Base64FormattingOptions.None);
            }
        }

        /// <summary>
        /// 字符串解密
        /// </summary>
        /// <param name="encryptedString">要解密的字符串</param>
        /// <returns>解密后的字符串</returns>
        public static string DESDecrypt(String encryptedString) {
            if (String.IsNullOrEmpty(encryptedString))
                return String.Empty;

            SymmetricAlgorithm cryptAlgorithm = new DESCryptoServiceProvider();
            cryptAlgorithm.Key = ENCRYPT_ENCODING.GetBytes(ENCRYPT_KEY);
            cryptAlgorithm.IV = ENCRYPT_ENCODING.GetBytes(ENCRYPT_IV);

            ICryptoTransform cryptor = cryptAlgorithm.CreateDecryptor();
            byte[] encryptedBytes = Convert.FromBase64String(encryptedString);

            using (MemoryStream ms = new MemoryStream()) {
                using (CryptoStream cs = new CryptoStream(ms, cryptor, CryptoStreamMode.Write)) {
                    cs.Write(encryptedBytes, 0, encryptedBytes.Length);
                    cs.FlushFinalBlock();
                }

                return ENCRYPT_ENCODING.GetString(ms.ToArray());
            }

        }

        #endregion

        #endregion
    }

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值