C#實現MD5加密,具體如下:
方法一
首先,先簡單介紹一下MD5
MD5的全稱是message-digest algorithm 5(信息-摘要算法,在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest開發出來, 經md2、md3和md4發展而來。
MD5具有很好的安全性(因為它具有不可逆的特征,加過密的密文經過解密后和加密前的東東相同的可能性極小)
引用
1
2
|
using System.Security.Cryptography; using System.Text; |
具體代碼如下(寫在按鈕的Click事件里):
1
2
3
4
|
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加密(上)
1
2
3
4
5
6
|
string a; //加密前數據 string b; //加密后數據 b=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(a, "MD5" ) using System; using System.Security.Cryptography; |
方法2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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> /// 給一個字符串進行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加密
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
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 { //將獲取的密碼加密與數據庫中加了密的密碼相比較 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()) { //用戶存在,對密碼進行檢查 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; //登錄成功,進行頁面導向 } else { this .RegisterStartupScript( "wp" , "<script language='javascript'>alert('密碼錯誤,請檢查。')</script>" ); } } else { this .RegisterStartupScript( "nu" , "<script language=javascript>alert('用戶名不存在,請檢查。')</script>" ); } } catch (Exception exec) { this .RegisterStartupScript( "wc" , "<script language=javascript>alert('網絡連接有異,請稍后重試。')</script>" ); } finally { conn.Close(); } } } |
方法三
C#開發筆記
一、C# MD5-16位加密實例,32位加密實例(兩種方法)
環境:vs.net2005/sql server2000/xp測試通過
1.MD5 16位加密實例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
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位加密 加密后密碼為大寫 /// </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位加密 加密后密碼為小寫 /// </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(); //實例化一個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; } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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;
假設密碼對話框名字password,對輸入的密碼加密后存入變量pwd中,語句如下:
1
|
string pwd = FormsAuthentication.HashPasswordForStoringInConfigFile(password.Text, "MD5" ); |
如果要錄入則錄入pwd,這樣數據庫實際的密碼為202*****等亂碼了。
如果登錄查詢則要:
1
|
select username, password from users where username= '"+ UserName.Text +"' and password = '"+ pwd +"' |
因為MD5不能解密,只能把原始密碼加密后與數據庫中加密的密碼比較
三、C# MD5 加密方法 16位或32位
1
2
3
4
5
6
7
8
9
10
11
|
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(); } } |
四、做一個網站時,必然涉及用戶登錄,用戶登錄必然涉及密碼,密碼必然涉及安全,安全必然涉及加密。
加密現時最流行也是據說最安全的算法是MD5算法,MD5是一種不可逆的算法,也就是 明文經過加密后,根據加密過的密文無法還原出明文來。
目前有好多網站專搞MD5破密,百度上搜一下MD5就搜出一大堆了,今天早上無聊試了幾個破密網站,6位以內純數字密碼的MD5密文可以還原出明文,長點的或帶字符的就不行了。他們是采用窮舉對比的,就是說把收錄到的明文和密文放到數據庫里,通過密文的對比來確定明文,畢竟收錄的數據有限,所以破解的密碼很有限。
扯遠了,搞破密MD5需要大量的MONEY,因為要一個運算得超快的計算機和一個查找性能超好的數據庫和超大的數據庫收錄。但搞加密就比較簡單。以下是我用C#寫的一個MD5加密的方法,用到.NET中的方法, 通過MD5_APP.StringToMD5(string str, int i)可以直接調用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public class MD5_APP { public MD5_APP() { } public static string StringToMD5( string str, int i) { //獲取要加密的字段,并轉化為Byte[]數組 byte [] data = System.Text.Encoding.Unicode.GetBytes(str.ToCharArray()); //建立加密服務 System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); //加密Byte[]數組 byte [] result = md5.ComputeHash(data); //將加密后的數組轉化為字段 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 "請確保調用函數時第二個參數為16或32" ; } } } |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.cnblogs.com/dgjack/archive/2010/12/30/1921492.html