C#编写注册界面将密码通过MD5加密后存入数据库

来源:互联网 发布:西门子s7200编程手册 编辑:程序博客网 时间:2024/04/29 06:50
<span style="font-family:Microsoft YaHei;font-size:18px;"># 将密码转换为md5 32位</span>
   public static string GetMD5(String input)    {        string cl = input;        string pwd = "";        MD5 md5 = MD5.Create();//实例化一个md5对像        // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择         byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));        // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得        for (int i = 0; i < s.Length; i++)        {            // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符              pwd = pwd + s[i].ToString("X");         }        return pwd;    }

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

示例代码如下:

[c-sharp] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9. using System.Security.Cryptography;  //MD5密码加密  
  10. using System.Data.SqlClient;  
  11. using System.IO;  
  12. using System.Runtime.Serialization.Formatters.Binary;  //反射  
  13.   
  14. namespace TestMD5  
  15. {  
  16.     public partial class LoginForm : Form  
  17.     {  
  18.         public LoginForm()  
  19.         {  
  20.             InitializeComponent();  
  21.         }  
  22.   
  23.         private void LoginForm_Load(object sender, EventArgs e)  
  24.         {  
  25.             users = new List<Users>();  
  26.             this.cboName.Text = "<请输入用户名>";  
  27.   
  28.             if (File.Exists("Userinfo.dll"))  
  29.             {  
  30.                 /*创建文件流对象 参数1:文件的(相对)路径也可以再另一个文件夹下如:User(文件夹)/userInfo.exe  
  31.                                 参数2:指定操作系统打开文件的方式 
  32.                                 参数3:指定文件的访问类型(这里为只读)  */  
  33.                 FileStream fs = new FileStream("Userinfo.dll", FileMode.Open, FileAccess.Read);  //使用第6个构造函数  
  34.                 BinaryFormatter bf = new BinaryFormatter();  //创建一个序列化和反序列化类的对象  
  35.   
  36.                 users = (List<Users>)bf.Deserialize(fs);  //调用反序列化方法,从文件userInfo.exe中读取对象信息  
  37.   
  38.                 for (int i = 0; i < users.Count; i++)    //将集合中的用户登录ID读取到下拉框中  
  39.                 {  
  40.                     if (i == 0 && users[i].UserPassword != "")   //如果第一个用户已经记住密码了  
  41.                     {  
  42.                         this.chkCode.Checked = true;   //把记住密码的复选框钩选上  
  43.                         this.txtPassword.Text = users[i].UserPassword;    //给密码框赋值  
  44.                     }  
  45.                     this.cboName.Items.Add(users[i].UserName);   //将每个项读到下拉框的集合中  
  46.                 }  
  47.   
  48.                 fs.Close();   //关闭文件流  
  49.                 this.cboName.SelectedIndex = 0;   //默认下拉框选中为第一项  
  50.             }  
  51.         }  
  52.   
  53.         private void btnCancle_Click(object sender, EventArgs e)  
  54.         {  
  55.             this.Close();  
  56.         }  
  57.   
  58.   
  59.         List<Users> users;   //声明一个用户类的泛型集合  
  60.         private void btnLogin_Click(object sender, EventArgs e)  
  61.         {  
  62.             #region 插入用户信息到数据库  
  63.             /* 
  64.              * int result = AddUser(this.cboName.Text.Trim(), Md5_32(this.txtPassword.Text.Trim())); 
  65.             if (result < 0) 
  66.                 MessageBox.Show("用名已经存在,请重新输入!"); 
  67.             else if (result > 0) 
  68.                 MessageBox.Show("添加新用记成功!"); 
  69.             else 
  70.                 MessageBox.Show("您没有成功添加新用户!");  
  71.              * */  
  72.             #endregion  
  73.   
  74.             string loginName = this.cboName.Text.Trim();  //将下拉框的登录名先保存在变量中  
  75.   
  76.             for (int i = 0; i < this.cboName.Items.Count; i++)  //遍历下拉框中的所有元素  
  77.             {  
  78.                 if (this.cboName.Items[i].ToString() == loginName) //如果当前登录用户在下拉列表中已经存在,则将其移除  
  79.                 {  
  80.                     this.cboName.Items.RemoveAt(i);  
  81.                     break;  
  82.                 }  
  83.             }  
  84.   
  85.             for (int i = 0; i < users.Count; i++)   //遍历用户集合中的所有元素  
  86.             {  
  87.                 if (users[i].UserName == loginName)  //如果当前登录用户在用户集合中已经存在,则将其移除  
  88.                 {  
  89.                     users.RemoveAt(i);  
  90.                     break;  
  91.                 }  
  92.             }  
  93.   
  94.             this.cboName.Items.Insert(0, loginName);  //每次都将最后一个登录的用户放插入到第一位  
  95.             Users user;  
  96.             if (this.chkCode.Checked == true)   //如果用户要求要记住密码  
  97.                 user = new Users(loginName,EncryptDES(this.txtPassword.Text.Trim()));  //如果用户要求记住密码则对该密码进行加密,再实例化一个用户对象  
  98.             else  
  99.                 user = new Users(loginName, "");  //否则只实例化一个用户对象,但密码设为空  
  100.   
  101.             users.Insert(0, user);   //在用户集合中插入该用户  
  102.             this.cboName.SelectedIndex = 0;   //让下拉框选中集合中的第一个  
  103.         }  
  104.                   
  105.         private void LoginForm_FormClosed(object sender, FormClosedEventArgs e)  
  106.         {  
  107.             /*创建文件流对象 参数1:文件的(相对)路径也可以再另一个文件夹下如:User(文件夹)/userInfo.exe  
  108.                                 参数2:指定操作系统打开文件的方式 
  109.                                 参数3:指定文件的访问类型(这里为只读)  */  
  110.             FileStream fs = new FileStream("Userinfo.dll", FileMode.Create, FileAccess.Write);  //使用第6个构造函数  
  111.             BinaryFormatter bf = new BinaryFormatter();  //创建一个序列化和反序列化对象  
  112.             bf.Serialize(fs, users);  //要先将User类先设为可以序列化(即在类的前面加[Serializable])。将用户集合信息写入到硬盘中  
  113.             fs.Close();   //关闭文件流  
  114.         }  
  115.   
  116.         private void cboName_SelectedIndexChanged(object sender, EventArgs e)  
  117.         {  
  118.             for (int i = 0; i < users.Count; i++)  //遍历用户集合中的所有用户  
  119.             {  
  120.                 if (users[i].UserName == this.cboName.Text)  //找到用户名与下拉框中用户名相同的那个用户  
  121.                 {  
  122.                     this.txtPassword.Text = users[i].UserPassword; //把该用户的密码赋值给密码框中  
  123.                     if (users[i].UserPassword != "")  //如果密码不为空时  
  124.                         this.chkCode.Checked = true;     //把记住密码的复选框钩选上  
  125.                     else  
  126.                         this.chkCode.Checked = false;   //否则记住密码的复选框不钩选  
  127.                 }  
  128.             }  
  129.         }  
  130.          
  131.  
  132.         #region MD5密码加密的方法  
  133.         /// <summary>  
  134.         /// 16位MD5密码加密(不可逆转)  
  135.         /// </summary>  
  136.         /// <param name="decryptString">需要加密的字符串</param>  
  137.         /// <returns></returns>  
  138.         public static string Md5_16(string decryptString)  
  139.         {  
  140.             MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();  
  141.             string str = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(decryptString)), 4, 8);  
  142.             //BitConverter.ToString()得到的字符串形式为2个一对,对与对之间加个“-”符号,如,“7F-2C-4A”。   
  143.             //md5.ComputeHash(UTF8Encoding.Default.GetBytes(t16.Text.Trim())),计算哈希值。   
  144.             //4表示初始位置,8表示有8个对,每个对都是2位,故有16位(32位为16对),即就是从第4对开始连续取8对。   
  145.             str = str.Replace("-""");  
  146.             return str;  
  147.         }  
  148.   
  149.         /// <summary>  
  150.         /// 32位MD5密码加密(不可逆转)  
  151.         /// </summary>  
  152.         /// <param name="decryptString">需要加密的字符串</param>  
  153.         /// <returns></returns>  
  154.         public static string Md5_32(string decryptString) //加密,不可逆  
  155.         {  
  156.             MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();  
  157.             string str = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(decryptString)));  
  158.             //BitConverter.ToString()得到的字符串形式为2个一对,对与对之间加个“-”符号,如,“7F-2C-4A”。   
  159.             //md5.ComputeHash(UTF8Encoding.Default.GetBytes(t16.Text.Trim())),计算哈希值。   
  160.             //4表示初始位置,8表示有8个对,每个对都是2位,故有16位(32位为16对),即就是从第4对开始连续取8对。   
  161.             str = str.Replace("-""");  
  162.             return str;  
  163.         }  
  164.   
  165.         /// <summary>  
  166.         /// 32位MD5密码加密  
  167.         /// </summary>  
  168.         /// <param name="decryptString">需要加密的字符串</param>  
  169.         /// <returns></returns>  
  170.         public static string Md5_32II(string decryptString)  
  171.         {  
  172.             string pwd = "";  
  173.             MD5 md5 = MD5.Create();//实例化一个md5对像     
  174.             byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(decryptString));  // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择              
  175.             for (int i = 0; i < s.Length; i++)  // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得   
  176.                 pwd = pwd + s[i].ToString("X"); // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符    
  177.             return pwd;  
  178.         }   
  179.         #endregion  
  180.  
  181.  
  182.         #region 将用户登录信息添加到数据库中  
  183.         /// <summary>  
  184.         /// 添加新用户  
  185.         /// </summary>  
  186.         /// <param name="uName">用户名</param>  
  187.         /// <param name="uPassword">用户密码</param>  
  188.         /// <returns></returns>  
  189.         public static int AddUser(string uName, string uPassword)  
  190.         {  
  191.             if (UserIsExist(uName) == false)  
  192.             {  
  193.                 const string UNAME = "@uName";  
  194.                 const string UPWD = "@uPwd";  
  195.   
  196.                 SqlParameter[] sqlParames = new SqlParameter[2];  
  197.                 sqlParames[0] = new SqlParameter(UNAME, SqlDbType.VarChar, 20);  
  198.                 sqlParames[0].Value = uName;  
  199.                 sqlParames[1] = new SqlParameter(UPWD, SqlDbType.VarChar, 32);  
  200.                 sqlParames[1].Value = uPassword;  
  201.   
  202.                 string sqlCmd = "insert into userInfo values(@uName,@uPwd)";  
  203.                 SqlConnection conn = new SqlConnection("server=.;database=MD5test;integrated security=sspi");  
  204.                 SqlCommand cmd = new SqlCommand(sqlCmd, conn);  
  205.                 cmd.Parameters.AddRange(sqlParames);  
  206.                 cmd.CommandType = CommandType.Text;  
  207.                 int i = 0;  
  208.                 try  
  209.                 {  
  210.                     conn.Open();  
  211.                     i = cmd.ExecuteNonQuery();  
  212.                 }  
  213.                 catch (Exception ex)  
  214.                 {  
  215.                     MessageBox.Show(ex.Message);  
  216.                 }  
  217.                 finally  
  218.                 {  
  219.                     conn.Close();  
  220.                 }  
  221.                 return i;  
  222.             }  
  223.             else  
  224.                 return -1;  //-1 表示该用户已经存在  
  225.         }  
  226.   
  227.         /// <summary>  
  228.         /// 查询用户是否已存在  
  229.         /// </summary>  
  230.         /// <param name="uName">用户名</param>  
  231.         /// <returns></returns>  
  232.         private static bool UserIsExist(string uName)  
  233.         {  
  234.             SqlConnection conn = new SqlConnection("server=.;database=MD5test;integrated security=sspi");  
  235.             SqlCommand cmd = new SqlCommand("select 1 from userInfo where uName = '" + uName + "'", conn);  
  236.             int i = -1;  
  237.             try  
  238.             {  
  239.                 conn.Open();  
  240.                 i = (int)cmd.ExecuteScalar();  
  241.             }  
  242.             catch (Exception ex)  
  243.             {  
  244.                 MessageBox.Show(ex.Message);  
  245.             }  
  246.             finally  
  247.             {  
  248.                 conn.Close();  
  249.             }  
  250.             if (i == 0)  
  251.                 return false;    
  252.             return true;  //真的表示用户已经存在  
  253.         }   
  254.         #endregion  
  255.  
  256.  
  257.         #region DES密码加密(可逆转,用于本地记住密码)  
  258.   
  259.         private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };  
  260.         private static string encryptKey = "abcdefgh";  
  261.   
  262.         /// <summary>  
  263.         /// DES加密字符串(可逆转加密)  
  264.         /// </summary>  
  265.         /// <param name="encryptString">待加密的字符串</param>  
  266.         /// <param name="encryptKey">加密密钥,要求为8位</param>  
  267.         /// <returns>加密成功返回加密后的字符串,失败返回源串</returns>  
  268.         public static string EncryptDES(string encryptString)  
  269.         {  
  270.             try  
  271.             {  
  272.                 byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));  
  273.                 byte[] rgbIV = Keys;  
  274.                 byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);  
  275.                 DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();  
  276.                 MemoryStream mStream = new MemoryStream();  
  277.                 CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);  
  278.                 cStream.Write(inputByteArray, 0, inputByteArray.Length);  
  279.                 cStream.FlushFinalBlock();  
  280.                 return Convert.ToBase64String(mStream.ToArray());  
  281.             }  
  282.             catch  
  283.             {  
  284.                 return encryptString;  
  285.             }  
  286.         }  
  287.         /// <summary>  
  288.         /// DES解密字符串  
  289.         /// </summary>  
  290.         /// <param name="decryptString">待解密的字符串</param>  
  291.         /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>  
  292.         /// <returns>解密成功返回解密后的字符串,失败返源串</returns>  
  293.         public static string DecryptDES(string decryptString)  
  294.         {  
  295.             try  
  296.             {  
  297.                 byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey);  
  298.                 byte[] rgbIV = Keys;  
  299.                 byte[] inputByteArray = Convert.FromBase64String(decryptString);  
  300.                 DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();  
  301.                 MemoryStream mStream = new MemoryStream();  
  302.                 CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);  
  303.                 cStream.Write(inputByteArray, 0, inputByteArray.Length);  
  304.                 cStream.FlushFinalBlock();  
  305.                 return Encoding.UTF8.GetString(mStream.ToArray());  
  306.             }  
  307.             catch  
  308.             {  
  309.                 return decryptString;  
  310.             }  
  311.         }   
  312.         #endregion  
  313.   
  314.   
  315.      
  316.     }  
  317.   
  318.     [Serializable]  //表示这个类可以被序列化  
  319.     class Users   //用户类  
  320.     {  
  321.         string _userName;  
  322.         public string UserName  
  323.         {  
  324.             get { return _userName; }  
  325.             set { _userName = value; }  
  326.         }  
  327.   
  328.         string _userPassword;  
  329.         public string UserPassword  
  330.         {  
  331.             get   
  332.             {   
  333.                 if(_userPassword != "")  //如果密码不为空  
  334.                     return LoginForm.DecryptDES(_userPassword); //将密码进行解密后再返出去  
  335.                 return _userPassword;  
  336.             }  
  337.             set { _userPassword = value; }  
  338.         }  
  339.   
  340.         public Users(string userName,string userPassword)  //用户类的构造函数  
  341.         {  
  342.             _userName = userName;  
  343.             _userPassword = userPassword;  
  344.         }  
  345.     }  
  346. }  

DES加密类。[code=csharp]        #region MD5加密 密码解密
        /// <summary>
        /// MD5加密
        /// </summary>
        /// <param name="pToEncrypt">待加密字符</param>
        /// <param name="sKey">密钥字符</param>
        /// <returns>加密后字符</returns>
        private static string sKey="12345678";
        public string MD5Encrypt(string pToEncrypt, string sKey)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
            des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
            des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
            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();
        }
        #endregion(字符)[/code]
然后我写了一个登录窗体和修改密码窗体,用SQL数据库录入一条数据,这条数据时用户名1密码2登录数据库,我要怎样调用DES类,才能实现数据库里的这条数据的密码是加密后的数据,然后在登录窗体我输入密码后,也变成加密后的数据到数据库里去匹配密码。关键是我不会调用,我不知道怎样写才能是输入的密码加密存到数据库里!


【作者精力有限更多常见加密算法参见】

1、常用的md5加密程序(16位、32位、小写、大写) -http://wenku.baidu.com/view/b0ea1575a417866fb84a8ec2.html

2、MD5加密算法(16位,32位)的C#的实现_ http://wenku.baidu.com/view/ba65101cbd64783e09122bf9.html

1 0
原创粉丝点击