You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

302 lines
10 KiB
C#

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();
}
/// <summary>
/// 公司通用加解密算法
/// 孙宜建
/// </summary>
/// <param name="src">加解密字符串</param>
/// <param name="key">密钥</param>
/// <param name="Encrypt">bool类型1为加密否则为解密</param>
/// <returns></returns>
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();
}
}
}