基于C#對(duì)用戶(hù)密碼使用MD5加密與解密
C#中常涉及到對(duì)用戶(hù)密碼的加密于解密的算法,其中使用MD5加密是最常見(jiàn)的的實(shí)現(xiàn)方式。本文總結(jié)了通用的算法并結(jié)合了自己的一點(diǎn)小經(jīng)驗(yàn),分享給大家。
一.使用16位、32位、64位MD5方法對(duì)用戶(hù)名加密
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(); //實(shí)例化一個(gè)md5對(duì)像 // 加密后是一個(gè)字節(jié)類(lèi)型的數(shù)組,這里要注意編碼UTF8/Unicode等的選擇 byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl)); // 通過(guò)使用循環(huán),將字節(jié)類(lèi)型的數(shù)組轉(zhuǎn)換為字符串,此字符串是常規(guī)字符格式化所得 for (int i = 0; i < s.Length; i++) { // 將得到的字符串使用十六進(jìn)制類(lèi)型格式。格式后的字符是小寫(xiě)的字母,如果使用大寫(xiě)(X)則格式后的字符是大寫(xiě)字符 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(); //實(shí)例化一個(gè)md5對(duì)像 // 加密后是一個(gè)字節(jié)類(lèi)型的數(shù)組,這里要注意編碼UTF8/Unicode等的選擇 byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl)); return Convert.ToBase64String(s); }
4)使用MD5為用戶(hù)密碼加密
/// <summary> /// 加密用戶(hù)密碼 /// </summary> /// <param name="password">密碼</param> /// <param name="codeLength">加密位數(shù)</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是不可逆的,所以加密之后就無(wú)法解密,取用戶(hù)名和密碼時(shí)候,需要再加密一邊用戶(hù)輸入的數(shù)據(jù)與數(shù)據(jù)庫(kù)中已加密的數(shù)據(jù)進(jìn)行比對(duì)。如果比對(duì)結(jié)果一致,則可以判定登陸成功!代碼如下所示:
/// <summary> /// 登陸 /// </summary> public Model.UserInfo UserLogOn(string USERID, string pwd, out string statusCode) { //假設(shè)已經(jīng)通過(guò)用戶(hù)ID獲取到UserInfo的Model對(duì)象 Model.UserInfo model = GetModel(USERID); if (model != null) { if (model.PASSWORD == MD5Encrypt64(pwd)) { statusCode = "登陸成功"; } else { statusCode = “密碼錯(cuò)誤”; } } else { statusCode = "用戶(hù)不存在!"; model = null; } return model; }
5)通過(guò)DESCryptoServiceProvider對(duì)象對(duì)字符串進(jìn)行加密解密
/// <summary> /// DES數(shù)據(jù)加密 /// </summary> /// <param name="targetValue">目標(biāo)值</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); // 通過(guò)兩次哈希密碼設(shè)置對(duì)稱(chēng)算法的初始化向量 des.Key = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile (FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5"). Substring(0, 8), "sha1").Substring(0, 8)); // 通過(guò)兩次哈希密碼設(shè)置算法的機(jī)密密鑰 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(); }
此種算法可以通過(guò)加密密鑰進(jìn)行解密,解密方法如下:
/// <summary> /// DES數(shù)據(jù)解密 /// </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加密對(duì)象 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; } // 通過(guò)兩次哈希密碼設(shè)置對(duì)稱(chēng)算法的初始化向量 des.Key = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile (FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5"). Substring(0, 8), "sha1").Substring(0, 8)); // 通過(guò)兩次哈希密碼設(shè)置算法的機(jī)密密鑰 des.IV = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile (FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5") .Substring(0, 8), "md5").Substring(0, 8)); // 定義內(nèi)存流 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()); }
以上內(nèi)容是基于C#對(duì)用戶(hù)密碼使用MD5加密與解密的全部敘述,希望大家喜歡。
相關(guān)文章
C#驗(yàn)證控件validator的簡(jiǎn)單使用
這篇文章主要介紹了C#驗(yàn)證控件validator的簡(jiǎn)單使用方法和示例,十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2015-06-06Unity屏幕雪花另類(lèi)實(shí)現(xiàn)方式示例
這篇文章主要介紹了Unity屏幕雪花另類(lèi)實(shí)現(xiàn)方式示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10c#調(diào)用c++的DLL的實(shí)現(xiàn)方法
本文主要介紹了c#調(diào)用c++的DLL的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05探討C#中Dispose方法與Close方法的區(qū)別詳解
本篇文章是對(duì)C#中Dispose方法與Close方法的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06Unity實(shí)現(xiàn)滑動(dòng)更換界面效果
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)滑動(dòng)更換界面效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07