一、定義的接口規範
using System;
namespace Fjelite.Technologic.Deadshot.Config
{
/// <summary>
/// 配置接口
/// </summary>
public interface IConfig
{
/// <summary>
/// 獲取配置的值
/// </summary>
/// <param name="configField">配置字段</param>
/// <returns>返回獲取的配置值</returns>
string GetConfig(string configField);
/// <summary>
/// 設置配置的值
/// </summary>
/// <param name="configField">配置字段</param>
/// <param name="configValue">配置值</param>
void SetConfig(string configField,string configValue);
/// <summary>
/// 增加一個配置
/// </summary>
/// <param name="configField">配置字段</param>
/// <param name="configValue">配置值</param>
void AddConfig(string configField,string configValue);
/// <summary>
/// 刪除一個配置
/// </summary>
/// <param name="configField">配置字段</param>
void RemoveConfig(string configField);
}
}
二、ini文件配置
using System;
using System.Text;
using System.Runtime.InteropServices;
namespace Fjelite.Technologic.Deadshot.Config
{
/// <summary>
/// IniConfig 的摘要說明。
/// </summary>
public class IniConfig:IConfig
{
private string fileName;
private IDataSecurity iDataSecurity;
//*寫ini文件
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section,string key,string val,string filePath);
//讀ini文件
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section,string key,string def,StringBuilder retVal,int size,string filePath);
/// <summary>
/// 構造函數
/// </summary>
/// <param name="filename">配置文件名字</param>
/// <param name="ids">加密解密方法</param>
public IniConfig(string filename,IDataSecurity ids)
{
fileName=filename;
iDataSecurity=ids;
}
#region IConfig 成員
/// <summary>
/// 獲取相應的配置
/// </summary>
/// <param name="configField">配置字段</param>
/// <returns>如果取到該值返回對應值</returns>
public string GetConfig(string configField)
{
System.Text.StringBuilder str = new StringBuilder(255);
GetPrivateProfileString("configs",configField,"",str,255,fileName);
return iDataSecurity.Decrypt(str.ToString());
}
/// <summary>
/// 設置配置字段
/// </summary>
/// <param name="configField">配置字段</param>
/// <param name="configValue">配置值</param>
public void SetConfig(string configField, string configValue)
{
WritePrivateProfileString("configs",configField,iDataSecurity.Encrypt(configValue),fileName);
}
/// <summary>
/// 增加一個配置
/// </summary>
/// <param name="configField">配置字段</param>
/// <param name="configValue">配置值</param>
public void AddConfig(string configField, string configValue)
{
// TODO: 添加 IniConfig.AddConfig 實現
WritePrivateProfileString("configs",configField,iDataSecurity.Encrypt(configValue),fileName);
}
/// <summary>
/// 移除一個配置,未實現
/// </summary>
/// <param name="configField">配置字段</param>
public void RemoveConfig(string configField)
{
// TODO: 添加 IniConfig.RemoveConfig 實現
}
#endregion
}
}
*.ini文件內容
[configs]'基本配置
database=391A9BAB8D7CE1AD
三、web.config的配置
using System;
using System.Xml;
namespace Fjelite.Technologic.Deadshot.Config
{
/// <summary>
/// WebConfig 的摘要說明。
/// </summary>
public class WebConfig:IConfig
{
private System.Xml.XmlDocument xmlDoc;
private string fileName;
private IDataSecurity iDataSecurity;
/// <summary>
/// 構造函數
/// </summary>
/// <param name="filename">配置文件名字</param>
/// <param name="ids">加密解密類</param>
public WebConfig(string filename,IDataSecurity ids)
{
xmlDoc=new XmlDocument();
fileName=filename;
iDataSecurity=ids;
try
{
xmlDoc.Load(filename);
}
catch
{
xmlDoc=null;
}
}
#region IConfig 成員
/// <summary>
/// 獲取相應的配置
/// </summary>
/// <param name="configField">配置字段</param>
/// <returns>如果取到該值返回對應值,沒有則返回null</returns>
public string GetConfig(string configField)
{
// TODO: 添加 WebConfig.GetConfig 實現
XmlNode xmlNode=xmlDoc.SelectSingleNode("configuration/appSettings/add[@key='" +configField +"']");
if(xmlNode==null)
{
return null;
}
return iDataSecurity.Decrypt(xmlNode.Attributes["value"].Value);
}
/// <summary>
/// 設置配置字段
/// </summary>
/// <param name="configField">配置字段</param>
/// <param name="configValue">配置值</param>
public void SetConfig(string configField, string configValue)
{
XmlElement xmlNode=(XmlElement)xmlDoc.SelectSingleNode("configuration/appSettings/add[@key='" +configField +"']");
if(xmlNode==null)
return;
xmlNode.SetAttribute("value",iDataSecurity.Encrypt(configValue));
xmlDoc.Save(fileName);
}
/// <summary>
/// 增加一個配置
/// </summary>
/// <param name="configField">配置字段</param>
/// <param name="configValue">配置值</param>
public void AddConfig(string configField, string configValue)
{
XmlNode node=xmlDoc.SelectSingleNode("configuration/appSettings");
XmlElement insertNode=xmlDoc.CreateElement("add");
insertNode.SetAttribute("key",configField);
insertNode.SetAttribute("value",iDataSecurity.Encrypt(configValue));
node.AppendChild(insertNode);
xmlDoc.Save(fileName);
}
/// <summary>
/// 移除一個配置
/// </summary>
/// <param name="configField">配置字段</param>
public void RemoveConfig(string configField)
{
if(configField.Length==0)
{
return;
}
XmlNode xmlNode=xmlDoc.SelectSingleNode("configuration/appSettings/add[@key='" +configField +"']");
if(xmlNode!=null)
{
xmlNode.ParentNode.RemoveChild(xmlNode);
}
xmlDoc.Save(fileName);
}
#endregion
}
}
四 、上述的加密接口
using System;
namespace Fjelite.Technologic.Deadshot.Config
{
/// <summary>
/// 數據安全類
/// </summary>
public interface IDataSecurity
{
/// <summary>
/// 加密方法
/// </summary>
/// <param name="input">輸入字符串</param>
/// <returns>加密後的返回值</returns>
string Encrypt(string input);
/// <summary>
/// 解密方法
/// </summary>
/// <param name="input">輸入字符串</param>
/// <returns>解密後的返回值</returns>
string Decrypt(string input);
}
}
五、實現的加密類
using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;
namespace Fjelite.Technologic.Deadshot.Config
{
/// <summary>
/// DataSecurityDES 的摘要說明。
/// </summary>
public class DataSecurityDES:IDataSecurity
{
private string key;
/// <summary>
/// 構造函數
/// </summary>
/// <param name="paraKey">DES加密解密鑰</param>
public DataSecurityDES(string paraKey)
{
key=paraKey;
if(key.Length<8)
key+="12345678";
}
#region IDataSecurity 成員
/// <summary>
/// 加密方法
/// </summary>
/// <param name="input">輸入的值</param>
/// <returns>加密後的值</returns>
public string Encrypt(string input)
{
if(input.Length==0)
{
return "";
}
//return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(input,"MD5");
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
//把字符串放到byte數組中
//原來使用的UTF8編碼,我改成Unicode編碼了,不行
byte[] inputByteArray = Encoding.Default.GetBytes(input);
//建立加密對象的密鑰和偏移量
//使得輸入密碼必須輸入英文文本
des.Key = ASCIIEncoding.ASCII.GetBytes(key.Substring(0,8));
des.IV = ASCIIEncoding.ASCII.GetBytes(key.Substring(0,8));
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(),CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach(byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
ret.ToString();
return ret.ToString();
}
/// <summary>
/// 解密方法
/// </summary>
/// <param name="input">輸入值</param>
/// <returns>解密後的值</returns>
public string Decrypt(string input)
{
if(input.Length==0)
{
return "";
}
System.Security.Cryptography.DESCryptoServiceProvider des=new DESCryptoServiceProvider();
byte[] inputByteArray=new byte[input.Length/2];
int leng=inputByteArray.Length;
for(int i = 0; i < input.Length / 2;i++)
{
string stt=input.Substring(i * 2, 2);
int temp = Convert.ToInt32(input.Substring(i * 2, 2), 16);
inputByteArray[i] = (byte)temp;
}
des.Key=System.Text.ASCIIEncoding.ASCII.GetBytes(key.Substring(0,8));
des.IV=System.Text.ASCIIEncoding.ASCII.GetBytes(key.Substring(0,8));
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(),CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
//建立StringBuild對象,CreateDecrypt使用的是流對象,必須把解密後的文本變成流對象
//StringBuilder ret = new StringBuilder();
return System.Text.Encoding.Default.GetString(ms.ToArray());
}
#endregion
}
}
其餘的配置都可從實現該接口來配置