注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

午夜阳光

 
 
 

日志

 
 

C# 实现在本地记住登录帐号和密码和实现将MD5密码添加到数据库中  

2012-12-13 13:50:25|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

示例代码如下:


[c-sharp] view plaincopyprint?
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.Security.Cryptography; //MD5密码加密
using System.Data.SqlClient;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary; //反射
namespace TestMD5
{
public partial class LoginForm : Form
{
public LoginForm()
{
InitializeComponent();
}
private void LoginForm_Load(object sender, EventArgs e)
{
users = new List<Users>();
this.cboName.Text = "<请输入用户名>";
if (File.Exists("Userinfo.dll"))
{
/*创建文件流对象 参数1:文件的(相对)路径也可以再另一个文件夹下如:User(文件夹)/userInfo.exe
参数2:指定操作系统打开文件的方式
参数3:指定文件的访问类型(这里为只读) */
FileStream fs = new FileStream("Userinfo.dll", FileMode.Open, FileAccess.Read); //使用第6个构造函数
BinaryFormatter bf = new BinaryFormatter(); //创建一个序列化和反序列化类的对象
users = (List<Users>)bf.Deserialize(fs); //调用反序列化方法,从文件userInfo.exe中读取对象信息
for (int i = 0; i < users.Count; i++) //将集合中的用户登录ID读取到下拉框中
{
if (i == 0 && users[i].UserPassword != "") //如果第一个用户已经记住密码了
{
this.chkCode.Checked = true; //把记住密码的复选框钩选上
this.txtPassword.Text = users[i].UserPassword; //给密码框赋值
}
this.cboName.Items.Add(users[i].UserName); //将每个项读到下拉框的集合中
}
fs.Close(); //关闭文件流
this.cboName.SelectedIndex = 0; //默认下拉框选中为第一项
}
}
private void btnCancle_Click(object sender, EventArgs e)
{
this.Close();
}
List<Users> users; //声明一个用户类的泛型集合
private void btnLogin_Click(object sender, EventArgs e)
{
#region 插入用户信息到数据库
/*
* int result = AddUser(this.cboName.Text.Trim(), Md5_32(this.txtPassword.Text.Trim()));
if (result < 0)
MessageBox.Show("用名已经存在,请重新输入!");
else if (result > 0)
MessageBox.Show("添加新用记成功!");
else
MessageBox.Show("您没有成功添加新用户!");
* */
#endregion
string loginName = this.cboName.Text.Trim(); //将下拉框的登录名先保存在变量中
for (int i = 0; i < this.cboName.Items.Count; i++) //遍历下拉框中的所有元素
{
if (this.cboName.Items[i].ToString() == loginName) //如果当前登录用户在下拉列表中已经存在,则将其移除
{
this.cboName.Items.RemoveAt(i);
break;
}
}
for (int i = 0; i < users.Count; i++) //遍历用户集合中的所有元素
{
if (users[i].UserName == loginName) //如果当前登录用户在用户集合中已经存在,则将其移除
{
users.RemoveAt(i);
break;
}
}
this.cboName.Items.Insert(0, loginName); //每次都将最后一个登录的用户放插入到第一位
Users user;
if (this.chkCode.Checked == true) //如果用户要求要记住密码
user = new Users(loginName,EncryptDES(this.txtPassword.Text.Trim())); //如果用户要求记住密码则对该密码进行加密,再实例化一个用户对象
else
user = new Users(loginName, ""); //否则只实例化一个用户对象,但密码设为空
users.Insert(0, user); //在用户集合中插入该用户
this.cboName.SelectedIndex = 0; //让下拉框选中集合中的第一个
}
private void LoginForm_FormClosed(object sender, FormClosedEventArgs e)
{
/*创建文件流对象 参数1:文件的(相对)路径也可以再另一个文件夹下如:User(文件夹)/userInfo.exe
参数2:指定操作系统打开文件的方式
参数3:指定文件的访问类型(这里为只读) */
FileStream fs = new FileStream("Userinfo.dll", FileMode.Create, FileAccess.Write); //使用第6个构造函数
BinaryFormatter bf = new BinaryFormatter(); //创建一个序列化和反序列化对象
bf.Serialize(fs, users); //要先将User类先设为可以序列化(即在类的前面加[Serializable])。将用户集合信息写入到硬盘中
fs.Close(); //关闭文件流
}
private void cboName_SelectedIndexChanged(object sender, EventArgs e)
{
for (int i = 0; i < users.Count; i++) //遍历用户集合中的所有用户
{
if (users[i].UserName == this.cboName.Text) //找到用户名与下拉框中用户名相同的那个用户
{
this.txtPassword.Text = users[i].UserPassword; //把该用户的密码赋值给密码框中
if (users[i].UserPassword != "") //如果密码不为空时
this.chkCode.Checked = true; //把记住密码的复选框钩选上
else
this.chkCode.Checked = false; //否则记住密码的复选框不钩选
}
}
}
#region MD5密码加密的方法
/// <summary>
/// 16位MD5密码加密(不可逆转)
/// </summary>
/// <param name="decryptString">需要加密的字符串</param>
/// <returns></returns>
public static string Md5_16(string decryptString)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
string str = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(decryptString)), 4, 8);
//BitConverter.ToString()得到的字符串形式为2个一对,对与对之间加个“-”符号,如,“7F-2C-4A”。
//md5.ComputeHash(UTF8Encoding.Default.GetBytes(t16.Text.Trim())),计算哈希值。
//4表示初始位置,8表示有8个对,每个对都是2位,故有16位(32位为16对),即就是从第4对开始连续取8对。
str = str.Replace("-", "");
return str;
}
/// <summary>
/// 32位MD5密码加密(不可逆转)
/// </summary>
/// <param name="decryptString">需要加密的字符串</param>
/// <returns></returns>
public static string Md5_32(string decryptString) //加密,不可逆
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
string str = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(decryptString)));
//BitConverter.ToString()得到的字符串形式为2个一对,对与对之间加个“-”符号,如,“7F-2C-4A”。
//md5.ComputeHash(UTF8Encoding.Default.GetBytes(t16.Text.Trim())),计算哈希值。
//4表示初始位置,8表示有8个对,每个对都是2位,故有16位(32位为16对),即就是从第4对开始连续取8对。
str = str.Replace("-", "");
return str;
}
/// <summary>
/// 32位MD5密码加密
/// </summary>
/// <param name="decryptString">需要加密的字符串</param>
/// <returns></returns>
public static string Md5_32II(string decryptString)
{
string pwd = "";
MD5 md5 = MD5.Create();//实例化一个md5对像
byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(decryptString)); // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择
for (int i = 0; i < s.Length; i++) // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
pwd = pwd + s[i].ToString("X"); // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
return pwd;
}
#endregion
#region 将用户登录信息添加到数据库中
/// <summary>
/// 添加新用户
/// </summary>
/// <param name="uName">用户名</param>
/// <param name="uPassword">用户密码</param>
/// <returns></returns>
public static int AddUser(string uName, string uPassword)
{
if (UserIsExist(uName) == false)
{
const string UNAME = "@uName";
const string UPWD = "@uPwd";
SqlParameter[] sqlParames = new SqlParameter[2];
sqlParames[0] = new SqlParameter(UNAME, SqlDbType.VarChar, 20);
sqlParames[0].Value = uName;
sqlParames[1] = new SqlParameter(UPWD, SqlDbType.VarChar, 32);
sqlParames[1].Value = uPassword;
string sqlCmd = "insert into userInfo values(@uName,@uPwd)";
SqlConnection conn = new SqlConnection("server=.;database=MD5test;integrated security=sspi");
SqlCommand cmd = new SqlCommand(sqlCmd, conn);
cmd.Parameters.AddRange(sqlParames);
cmd.CommandType = CommandType.Text;
int i = 0;
try
{
conn.Open();
i = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
}
return i;
}
else
return -1; //-1 表示该用户已经存在
}
/// <summary>
/// 查询用户是否已存在
/// </summary>
/// <param name="uName">用户名</param>
/// <returns></returns>
private static bool UserIsExist(string uName)
{
SqlConnection conn = new SqlConnection("server=.;database=MD5test;integrated security=sspi");
SqlCommand cmd = new SqlCommand("select 1 from userInfo where uName = '" + uName + "'", conn);
int i = -1;
try
{
conn.Open();
i = (int)cmd.ExecuteScalar();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
}
if (i == 0)
return false;
return true; //真的表示用户已经存在
}
#endregion
#region DES密码加密(可逆转,用于本地记住密码)
private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
private static string encryptKey = "abcdefgh";
/// <summary>
/// DES加密字符串(可逆转加密)
/// </summary>
/// <param name="encryptString">待加密的字符串</param>
/// <param name="encryptKey">加密密钥,要求为8位</param>
/// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
public static string EncryptDES(string encryptString)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
byte[] rgbIV = Keys;
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
catch
{
return encryptString;
}
}
/// <summary>
/// DES解密字符串
/// </summary>
/// <param name="decryptString">待解密的字符串</param>
/// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
/// <returns>解密成功返回解密后的字符串,失败返源串</returns>
public static string DecryptDES(string decryptString)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey);
byte[] rgbIV = Keys;
byte[] inputByteArray = Convert.FromBase64String(decryptString);
DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
catch
{
return decryptString;
}
}
#endregion
}
[Serializable] //表示这个类可以被序列化
class Users //用户类
{
string _userName;
public string UserName
{
get { return _userName; }
set { _userName = value; }
}
string _userPassword;
public string UserPassword
{
get
{
if(_userPassword != "") //如果密码不为空
return LoginForm.DecryptDES(_userPassword); //将密码进行解密后再返出去
return _userPassword;
}
set { _userPassword = value; }
}
public Users(string userName,string userPassword) //用户类的构造函数
{
_userName = userName;
_userPassword = userPassword;
}
}
}

  评论这张
 
阅读(412)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017