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
}