using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; using System.Security.Cryptography; using System.IO; namespace ClientTest { /* *类名称:LoginForm *创建人:韩荣伟 *创建时间:2010-10-30 *功能描述:用户登录窗口类 */ public partial class LoginForm : Form { private byte[] key = { (byte)'I', (byte)'M', (byte)'m', (byte)'e', (byte)'s', (byte)'n', (byte)'a', (byte)'c' }; public LoginForm() { InitializeComponent(); } /* *方法名称:btnOK_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:执行登录 */ private void btnOK_Click(object sender, EventArgs e) { if (Common.frmMain == null) { Common.frmMain = new FrmMain(); } //check passed if (CheckPasswd(tbUserName.Text, tbPassword.Text) == true) { this.Hide(); Common.frmMain.ShowDialog(); } else { MessageBox.Show("用户名或密码错误,登录失败!", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Stop); } this.Close(); } /// /// 公司通用加解密算法 /// 孙宜建 /// /// 加解密字符串 /// 密钥 /// bool类型,1为加密,否则为解密 /// public static string EncryptionEngine(string src, string key, Boolean Encrypt) { int KeyLen; int KeyPos; int offset; string dest; int SrcPos; int SrcAsc; int TmpSrcAsc; int Range; KeyLen = key.Length; if (KeyLen == 0) { key = "Mesnac"; } KeyPos = 0; SrcPos = 0; SrcAsc = 0; Range = 256; if (Encrypt) //加密 { //System.Random r = new Random(Range); //offset = r.Next(Range); System.Random r = new Random(); offset = r.Next() % 256 + 1; dest = string.Format("{0:X}", offset); if (dest.Length == 1) { dest = "0" + dest; } for (SrcPos = 0; SrcPos < src.Length; SrcPos++) { SrcAsc = ((int)src[SrcPos] + offset) % 255; if (KeyPos < KeyLen) { KeyPos = KeyPos + 1; } else { KeyPos = 0; } SrcAsc = SrcAsc ^ (int)key[KeyPos]; //异或 string tempSrcAsc = string.Format("{0:X}", SrcAsc); if (tempSrcAsc.Length == 1) { tempSrcAsc = "0" + tempSrcAsc; } dest = dest + tempSrcAsc; offset = SrcAsc; } return dest; } else //解密 { if (src.Length <= 2) { return ""; } dest = ""; //offset = (int)("0x" + src.Substring(1, 2)); offset = Convert.ToInt32(src.Substring(0, 2), 16); SrcPos = 2; while (SrcPos < src.Length) { SrcAsc = Convert.ToInt32(src.Substring(SrcPos, 2), 16); if (KeyPos < KeyLen) { KeyPos = KeyPos + 1; } else { KeyPos = 0; } TmpSrcAsc = SrcAsc ^ (int)key[KeyPos]; //异或 if (TmpSrcAsc <= offset) { TmpSrcAsc = 255 + TmpSrcAsc - offset; } else { TmpSrcAsc = TmpSrcAsc - offset; } dest = dest + (char)TmpSrcAsc; offset = SrcAsc; SrcPos = SrcPos + 2; } } return dest; } /* *方法名称:Encrypt *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:String pwd 待加密的口令串 *返回描述:String 加密后的口令串 *功能描述:对口令进行加密 */ private String Encrypt(String pwd) { DESCryptoServiceProvider desc = new DESCryptoServiceProvider();//des进行加密 //PasswordDeriveBytes db = new PasswordDeriveBytes(pwd, null);//产生key MemoryStream ms = new MemoryStream();//存储加密后的数据 CryptoStream cs = new CryptoStream(ms, desc.CreateEncryptor(key, key), CryptoStreamMode.Write); byte[] data = Encoding.Unicode.GetBytes(pwd);//取到密码的字节流 cs.Write(data, 0, data.Length);//进行加密 cs.FlushFinalBlock(); byte[] res = ms.ToArray();//取加密后的数据 return Encoding.Unicode.GetString(res);//转换到字符串返回 } /* *方法名称:Decrypt *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:String data 被加密的口令串 *返回描述:String 解密后的口令串 *功能描述:对口令进行解密 */ private String Decrypt(String data) { DESCryptoServiceProvider desc = new DESCryptoServiceProvider(); //PasswordDeriveBytes db = new PasswordDeriveBytes(pwd, null);//产生key MemoryStream ms = new MemoryStream();//存储解密后的数据 CryptoStream cs = new CryptoStream(ms, desc.CreateDecryptor(key, key), CryptoStreamMode.Write); byte[] databytes = Encoding.Unicode.GetBytes(data);//取到加密后的数据的字节流 cs.Write(databytes, 0, databytes.Length);//解密数据 cs.FlushFinalBlock(); byte[] res = ms.ToArray(); return Encoding.Unicode.GetString(res);//返回解密后的数据 } /* *方法名称:CheckPasswd *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:string sUserName 用户名, string sPasswd 加密后的口令串 *返回描述:bool 密码核对,true 成功,false 失败 *功能描述:对用户名,口令进行核对 */ private bool CheckPasswd(string sUserName, string sPasswd) { bool res = false; //算查询参数 string sEncryptPasswd = EncryptPassword(sPasswd, "MD5"); //数据库查询 string querySQLString = string.Format("select 1 from [dbo].[T_Sys_UserInfo] where [UseName]='{0}' and [UserPwd]='{1}'", sUserName, sEncryptPasswd);//???????????????????sUserName sEncryptPasswd string connectMaskString = "database={0};Integrated Security=False;user id=sa;password={1};server={2};Connection Timeout=90"; int nLen = Common.configReader.sPWD.Length; if (nLen % 2 != 0) { return false; } byte[] btPWD = new byte[nLen / 2]; for (int i = 0; i < nLen / 2; i++) { btPWD[i] = Convert.ToByte(Common.configReader.sPWD.Substring(i * 2, 2), 16); } string sPWDForDB = System.Text.Encoding.Unicode.GetString(btPWD); string sPlainPWDForDB = EncryptionEngine(Common.configReader.sPWD, String.Empty, false); //Decrypt(sPWDForDB); string connectString = string.Format(connectMaskString, Common.configReader.sDatabase, sPlainPWDForDB, Common.configReader.sServer); using (SqlConnection connection = new SqlConnection(connectString)) { SqlCommand command = new SqlCommand(querySQLString, connection); try { connection.Open(); SqlDataReader reader = command.ExecuteReader(); if (reader.HasRows) { res = true; } } catch (Exception e1) { //MessageBox.Show(e1.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } return res; } /* *方法名称:EncryptPassword *创建人:李然 *创建时间: *参数描述:string PasswordString 待加密的字符串, string PasswordFormat 加密格式 *返回描述:string 加密后的字符串 *功能描述:加密字符串 */ public static string EncryptPassword(string PasswordString, string PasswordFormat) { string strResult = ""; if (PasswordFormat == "SHA1") strResult = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(PasswordString, "SHA1"); if (PasswordFormat == "MD5") strResult = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(PasswordString, "MD5"); return strResult; } /* *方法名称:btnCancel_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:取消登录,关闭窗口 */ private void btnCancel_Click(object sender, EventArgs e) { this.Close(); } /* *方法名称:LoginForm_Shown *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:登录窗口显示处理 */ private void LoginForm_Shown(object sender, EventArgs e) { tbUserName.Focus(); } } }