標籤:base64 byte conf ted rem 字母 logo substring 資料
C#中常涉及到對使用者密碼的加密於解密的演算法,其中使用MD5加密是最常見的的實現方式。本文總結了通用的演算法並結合了自己的一點小經驗,分享給大家。
一.使用16位、32位、64位MD5方法對使用者名稱加密
1)16位的MD5加密
/// <summary>/// 16位MD5加密/// </summary>/// <param name="password"></param>/// <returns></returns>public static string MD5Encrypt16(string password){ var md5 = new MD5CryptoServiceProvider(); string t2 = BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(password)), 4, 8); t2 = t2.Replace("-", ""); return t2;}
2)32位的MD5加密
/// <summary>/// 32位MD5加密/// </summary>/// <param name="password"></param>/// <returns></returns>public static string MD5Encrypt32(string password){ string cl = password; 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;}
3)64位的MD5加密
public static string MD5Encrypt64(string password){ string cl = password; //string pwd = ""; MD5 md5 = MD5.Create(); //執行個體化一個md5對像 // 加密後是一個位元組類型的數組,這裡要注意編碼UTF8/Unicode等的選擇 byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl)); return Convert.ToBase64String(s);}
4)使用MD5為使用者密碼加密
/// <summary>/// 加密使用者密碼/// </summary>/// <param name="password">密碼</param>/// <param name="codeLength">加密位元</param>/// <returns>加密密碼</returns>public static string md5(string password, int codeLength){ if (!string.IsNullOrEmpty(password)) { // 16位MD5加密(取32位加密的9~25字元) if (codeLength == 16) { return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5").ToLower().Substring(8, 16); } // 32位加密 if (codeLength == 32) { return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5").ToLower(); } } return string.Empty;}
由於MD5是無法復原的,所以加密之後就無法解密,取使用者名稱和密碼時候,需要再加密一邊使用者輸入的資料與資料庫中已加密的資料進行比對。如果比對結果一致,則可以判定登陸成功!代碼如下所示:
/// <summary>/// 登陸/// </summary>public Model.UserInfo UserLogOn(string USERID, string pwd, out string statusCode){ //假設已經通過使用者ID擷取到UserInfo的Model對象 Model.UserInfo model = GetModel(USERID); if (model != null) { if (model.PASSWORD == MD5Encrypt64(pwd)) { statusCode = "登陸成功"; } else { statusCode = “密碼錯誤”; } } else { statusCode = "使用者不存在!"; model = null; } return model;}
5)通過DESCryptoServiceProvider對象對字串進行加密解密
/// <summary>/// DES資料加密/// </summary>/// <param name="targetValue">目標值</param>/// <param name="key">密鑰</param>/// <returns>加密值</returns>public static string Encrypt(string targetValue, string key){ if (string.IsNullOrEmpty(targetValue)) { return string.Empty; } var returnValue = new StringBuilder(); var des = new DESCryptoServiceProvider(); byte[] inputByteArray = Encoding.Default.GetBytes(targetValue); // 通過兩次雜湊密碼設定對稱演算法的初始化向量 des.Key = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile (FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5"). Substring(0, 8), "sha1").Substring(0, 8)); // 通過兩次雜湊密碼設定演算法的機密密鑰 des.IV = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile (FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5") .Substring(0, 8), "md5").Substring(0, 8)); var ms = new MemoryStream(); var cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); foreach (byte b in ms.ToArray()) { returnValue.AppendFormat("{0:X2}", b); } return returnValue.ToString();}
此種演算法可以通過加密金鑰進行解密,解密方法如下:
/// <summary>/// DES資料解密/// </summary>/// <param name="targetValue"></param>/// <param name="key"></param>/// <returns></returns>public static string Decrypt(string targetValue, string key){ if (string.IsNullOrEmpty(targetValue)) { return string.Empty; } // 定義DES加密對象 var des = new DESCryptoServiceProvider(); int len = targetValue.Length / 2; var inputByteArray = new byte[len]; int x, i; for (x = 0; x < len; x++) { i = Convert.ToInt32(targetValue.Substring(x * 2, 2), 16); inputByteArray[x] = (byte)i; } // 通過兩次雜湊密碼設定對稱演算法的初始化向量 des.Key = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile (FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5"). Substring(0, 8), "sha1").Substring(0, 8)); // 通過兩次雜湊密碼設定演算法的機密密鑰 des.IV = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile (FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5") .Substring(0, 8), "md5").Substring(0, 8)); // 定義記憶體流 var ms = new MemoryStream(); // 定義加密流 var cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); return Encoding.Default.GetString(ms.ToArray());}
轉 C#:使用MD5對使用者密碼加密與解密