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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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();
}
}
}