詳解C#實(shí)現(xiàn)MD5加密的示例代碼
C#實(shí)現(xiàn)MD5加密,具體如下:
方法一
首先,先簡(jiǎn)單介紹一下MD5
MD5的全稱是message-digest algorithm 5(信息-摘要算法,在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest開(kāi)發(fā)出來(lái), 經(jīng)md2、md3和md4發(fā)展而來(lái)。
MD5具有很好的安全性(因?yàn)樗哂胁豢赡娴奶卣?加過(guò)密的密文經(jīng)過(guò)解密后和加密前的東東相同的可能性極小)
引用
using System.Security.Cryptography; using System.Text;
具體代碼如下(寫(xiě)在按鈕的Click事件里):
byte[] result = Encoding.Default.GetBytes(this.tbPass.Text.Trim()); //tbPass為輸入密碼的文本框 MD5 md5 = new MD5CryptoServiceProvider(); byte[] output = md5.ComputeHash(result); this.tbMd5pass.Text = BitConverter.ToString(output).Replace("-",""); //tbMd5pass為輸出加密文本的文本框
方法二
C# md5加密(上)
string a; //加密前數(shù)據(jù) string b; //加密后數(shù)據(jù) b=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(a,"MD5") using System; using System.Security.Cryptography;
方法2
public static string GetMD5(string myString) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] fromData = System.Text.Encoding.Unicode.GetBytes(myString); byte[] targetData = md5.ComputeHash(fromData); string byte2String = null; for (int i=0; i<targetData.Length; i++) { byte2String += targetData[i].ToString("x"); } return byte2String; } using System.Security.Cryptography; /// <summary> /// 給一個(gè)字符串進(jìn)行MD5加密 /// </summary> /// <param name="strText">待加密字符串</param> /// <returns>加密后的字符串</returns> public static string MD5Encrypt(string strText) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] result = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(strText)); return System.Text.Encoding.Default.GetString(result); }
C# MD5加密
using System.Security.Cryptography; private void btnOK_Click(object sender, System.EventArgs e) { string strConn = "server=192.168.0.51;database=chengheng;User id=sa; password=123"; if(texName.Text.Trim()=="") { this.RegisterStartupScript("sf","<script language='javascript'>alert('用戶名不能為空');document.all('texName').focus()</script>"); return; } else if(texPassword.Text.Trim()=="") { this.RegisterStartupScript("sfs","<script language='javascript'>alert('密碼不能為空');document.all('texPassword').focus()</script>"); return; } else { //將獲取的密碼加密與數(shù)據(jù)庫(kù)中加了密的密碼相比較 byte[] by = md5.ComputeHash(utf.GetBytes(texPassword.Text.Trim())); string resultPass = System.Text.UTF8Encoding.Unicode.GetString(by); conn.ConnectionString=strConn; SqlCommand comm = new SqlCommand(); string name = texName.Text.Trim().ToString(); comm.CommandText="select Ruser_pwd,Ruser_nm from Ruser where Accountno = @name"; comm.Parameters.Add("@name",SqlDbType.NVarChar,40); comm.Parameters["@name"].Value=name; try { conn.Open(); comm.Connection=conn; SqlDataReader dr=comm.ExecuteReader(); if(dr.Read()) { //用戶存在,對(duì)密碼進(jìn)行檢查 if(dr.GetValue(0).Equals(resultPass)) { string user_name=dr.GetValue(1).ToString(); string user_Accountno=texName.Text.Trim(); Session["logon_name"]=user_name; Session["logon_Accountno"]=user_Accountno; //登錄成功,進(jìn)行頁(yè)面導(dǎo)向 } else { this.RegisterStartupScript("wp","<script language='javascript'>alert('密碼錯(cuò)誤,請(qǐng)檢查。')</script>"); } } else { this.RegisterStartupScript("nu","<script language=javascript>alert('用戶名不存在,請(qǐng)檢查。')</script>"); } } catch(Exception exec) { this.RegisterStartupScript("wc","<script language=javascript>alert('網(wǎng)絡(luò)連接有異,請(qǐng)稍后重試。')</script>"); } finally { conn.Close(); } } }
方法三
C#開(kāi)發(fā)筆記
一、C# MD5-16位加密實(shí)例,32位加密實(shí)例(兩種方法)
環(huán)境:vs.net2005/sql server2000/xp測(cè)試通過(guò)
1.MD5 16位加密實(shí)例
using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptography; namespace md5 { class Program { static void Main(string[] args) { Console.WriteLine(UserMd5("8")); Console.WriteLine(GetMd5Str("8")); } /**//// <summary> /// MD5 16位加密 加密后密碼為大寫(xiě) /// </summary> /// <param name="ConvertString"></param> /// <returns></returns> public static string GetMd5Str(string ConvertString) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); string t2 = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(ConvertString)), 4, 8); t2 = t2.Replace("-", ""); return t2; } /**//// <summary> /// MD5 16位加密 加密后密碼為小寫(xiě) /// </summary> /// <param name="ConvertString"></param> /// <returns></returns> public static string GetMd5Str(string ConvertString) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); string t2 = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(ConvertString)), 4, 8); t2 = t2.Replace("-", ""); t2 = t2.ToLower(); return t2; } /**//// <summary> /// MD5 32位加密 /// </summary> /// <param name="str"></param> /// <returns></returns> static string UserMd5(string str) { string cl = str; string pwd = ""; MD5 md5 = MD5.Create();//實(shí)例化一個(gè)md5對(duì)像 // 加密后是一個(gè)字節(jié)類型的數(shù)組,這里要注意編碼UTF8/Unicode等的選擇 byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl)); // 通過(guò)使用循環(huán),將字節(jié)類型的數(shù)組轉(zhuǎn)換為字符串,此字符串是常規(guī)字符格式化所得 for (int i = 0; i < s.Length; i++) { // 將得到的字符串使用十六進(jìn)制類型格式。格式后的字符是小寫(xiě)的字母,如果使用大寫(xiě)(X)則格式后的字符是大寫(xiě)字符 pwd = pwd + s[i].ToString("X"); } return pwd; } } }
using System.Security.Cryptography; using System.Text; public static string StringToMD5Hash(string inputString) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] encryptedBytes = md5.ComputeHash(Encoding.ASCII.GetBytes(inputString)); StringBuilder sb = new StringBuilder(); for (int i = 0; i < encryptedBytes.Length; i++) { sb.AppendFormat("{0:x2}", encryptedBytes[i]); } return sb.ToString(); }
二、首先在界面中引入:using System.Web.Security;
假設(shè)密碼對(duì)話框名字password,對(duì)輸入的密碼加密后存入變量pwd中,語(yǔ)句如下:
string pwd = FormsAuthentication.HashPasswordForStoringInConfigFile(password.Text, "MD5");
如果要錄入則錄入pwd,這樣數(shù)據(jù)庫(kù)實(shí)際的密碼為202*****等亂碼了。
如果登錄查詢則要:
select username,password from users where username='"+ UserName.Text +"' and password='"+ pwd +"'
因?yàn)镸D5不能解密,只能把原始密碼加密后與數(shù)據(jù)庫(kù)中加密的密碼比較
三、C# MD5 加密方法 16位或32位
public string md5(string str,int code) { if(code==16) //16位MD5加密(取32位加密的9~25字符) { return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str,"MD5").ToLower().Substring(8,16) ; } else//32位加密 { return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str,"MD5").ToLower(); } }
四、做一個(gè)網(wǎng)站時(shí),必然涉及用戶登錄,用戶登錄必然涉及密碼,密碼必然涉及安全,安全必然涉及加密。
加密現(xiàn)時(shí)最流行也是據(jù)說(shuō)最安全的算法是MD5算法,MD5是一種不可逆的算法,也就是 明文經(jīng)過(guò)加密后,根據(jù)加密過(guò)的密文無(wú)法還原出明文來(lái)。
目前有好多網(wǎng)站專搞MD5破密,百度上搜一下MD5就搜出一大堆了,今天早上無(wú)聊試了幾個(gè)破密網(wǎng)站,6位以內(nèi)純數(shù)字密碼的MD5密文可以還原出明文,長(zhǎng)點(diǎn)的或帶字符的就不行了。他們是采用窮舉對(duì)比的,就是說(shuō)把收錄到的明文和密文放到數(shù)據(jù)庫(kù)里,通過(guò)密文的對(duì)比來(lái)確定明文,畢竟收錄的數(shù)據(jù)有限,所以破解的密碼很有限。
扯遠(yuǎn)了,搞破密MD5需要大量的MONEY,因?yàn)橐粋€(gè)運(yùn)算得超快的計(jì)算機(jī)和一個(gè)查找性能超好的數(shù)據(jù)庫(kù)和超大的數(shù)據(jù)庫(kù)收錄。但搞加密就比較簡(jiǎn)單。以下是我用C#寫(xiě)的一個(gè)MD5加密的方法,用到.NET中的方法, 通過(guò)MD5_APP.StringToMD5(string str, int i)可以直接調(diào)用:
public class MD5_APP { public MD5_APP() { } public static string StringToMD5(string str, int i) { //獲取要加密的字段,并轉(zhuǎn)化為Byte[]數(shù)組 byte[] data = System.Text.Encoding.Unicode.GetBytes(str.ToCharArray()); //建立加密服務(wù) System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); //加密Byte[]數(shù)組 byte[] result = md5.ComputeHash(data); //將加密后的數(shù)組轉(zhuǎn)化為字段 if (i == 16 && str != string.Empty) { return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower().Substring(8, 16); } else if (i == 32 && str != string.Empty) { return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower(); } else { switch (i) { case 16: return "000000000000000"; case 32: return "000000000000000000000000000000"; default: return "請(qǐng)確保調(diào)用函數(shù)時(shí)第二個(gè)參數(shù)為16或32"; } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#實(shí)現(xiàn)把dgv里的數(shù)據(jù)完整的復(fù)制到一張內(nèi)存表的方法
這篇文章主要介紹了C#實(shí)現(xiàn)把dgv里的數(shù)據(jù)完整的復(fù)制到一張內(nèi)存表的方法,需要的朋友可以參考下2014-08-08Unity基于ShaderLab實(shí)現(xiàn)光照系統(tǒng)(著色器代碼實(shí)現(xiàn)小結(jié))
這篇文章主要介紹了Unity基于ShaderLab實(shí)現(xiàn)光照系統(tǒng),主要總結(jié)unity中shaderlab的著色器代碼實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01C# 添加、修改和刪除PDF書(shū)簽的實(shí)例代碼
本篇文章主要介紹了C# 添加、修改和刪除PDF書(shū)簽的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07c# socket網(wǎng)絡(luò)編程接收發(fā)送數(shù)據(jù)示例代碼
這篇文章主要介紹了c# socket網(wǎng)絡(luò)編程,server端接收,client端發(fā)送數(shù)據(jù),大家參考使用吧2013-12-12WPF實(shí)現(xiàn)背景燈光隨鼠標(biāo)閃動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)背景燈光隨鼠標(biāo)閃動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08C#調(diào)用EXE文件實(shí)現(xiàn)傳參和獲取返回結(jié)果
本文主要介紹了C#調(diào)用EXE文件實(shí)現(xiàn)傳參和獲取返回結(jié)果,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01C#?winform跨線程操作控件的實(shí)現(xiàn)
本文主要介紹了C#?winform跨線程操作控件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06C#開(kāi)發(fā)微信門戶及應(yīng)用(4) 關(guān)注用戶列表及詳細(xì)信息管理
這篇文章主要為大家詳細(xì)介紹了C#開(kāi)發(fā)微信門戶及應(yīng)用第四篇,關(guān)注用戶列表及詳細(xì)信息管理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06C#實(shí)現(xiàn)Word文檔轉(zhuǎn)Markdown格式的示例代碼
文檔格式的多樣性豐富了我們的信息交流手段,其中Word文檔因其強(qiáng)大的功能性而廣受歡迎,Markdown因其簡(jiǎn)潔、易于閱讀和編輯的特性而展現(xiàn)出獨(dú)特的優(yōu)勢(shì),本文將介紹如何在.NET平臺(tái)使用C#代碼實(shí)現(xiàn)Word文檔到Markdown格式的轉(zhuǎn)換,需要的朋友可以參考下2024-04-04