前言:
今天我來學習利用JAVA編程,通過MD5來實現加密,同時實現驗證用戶登錄原理。
主要是 過程:
將原文的byte 文件通過 MD5加密完成 后。再將其轉化為我們能看懂的密文(MD5生成的byte數據,我們無法識別)
主要代碼如下
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
package techDemo; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Scanner; import org.junit.Test; import sun.misc.BASE64Encoder; /** * MD5加密算法 * @author<a href="mailto:[email protected]" rel="external nofollow" >胡龍華</a> * @version 2017-5-30 下午1:34:51 * @fileName MD5.java */ public class MD5 { public static void main(String[] args) throws Exception { MessageDigest md = MessageDigest.getInstance( "MD5" ); // 原文: String pwd = "12345" ; // digese---得到byte數組 加密后的 byte b []= md.digest(pwd.getBytes()); System.out.println(b.length); // 16 // 再將byte b [] 轉化為我們能看的懂 密文 //第一種方式:BASE64Encoder (要導依賴包) BASE64Encoder bd = new BASE64Encoder(); //密文1: String strpwd1 = bd.encode(b); System.out.println(strpwd1); //第二種方式:自己寫代碼將byte 數組轉化為16進制的并且最后的密文保證長度為32 String strpwd2 = "" ; for ( byte i:b){ // 將單個字節轉化為 16 進制 String s = Integer.toHexString(i & 0xff ); // 當i<16時,長度為1加個符號 ,這樣可以保證最后為 密文為32 if (s.length()== 1 ){ s = s + "0" ; } strpwd2 += s; } System.out.println(strpwd2); /* 輸出結果 16 gnzLDuqKcGxMNKFokfhOew== 827ccbe0ea8a706c4c34a16891f84e7b */ } // 演示模擬用戶登錄 @Test public void demoLogin() throws Exception{ // 當用戶注冊成功時,把用戶的密碼生成密文和用戶名一起保存 // 登錄時,通過把用戶輸入密碼再次生成密文,判斷兩次密文是否一致來驗證用戶 // 假設用戶密碼是 123456789,先生成密文 String pwd = "123456789" ; String Mpwd = Md5(pwd); Scanner sc = new Scanner(System.in); while ( true ){ System.out.println( "請輸入密碼" ); String p = sc.nextLine(); if (Mpwd.equals( Md5(p))){ System.out.println( "密碼正確" ); break ; } else { System.out.println( "密碼錯誤,請重新輸入" ); } } } private String Md5(String pwd) throws NoSuchAlgorithmException { String Mpwd = "" ; MessageDigest md = MessageDigest.getInstance( "MD5" ); byte b [] = md.digest(pwd.getBytes()); for ( byte i:b){ String s = Integer.toHexString( i & 0xff ); if (s.length()== 1 ){ s = s + "0" ; } Mpwd = s + pwd; } return Mpwd; } } |
下面是 我們老師的代碼 更加細節
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
69
70
71
72
73
74
75
76
77
|
package techDemo; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import org.junit.Test; import sun.misc.BASE64Encoder; public class Md5Demo { //加密算法類java.security.MessageDigest @Test //md5加密的核心代碼 public void demo1() throws Exception{ MessageDigest md = MessageDigest.getInstance( "MD5" ); String pwd= "ewi24343423" ; byte b1[] = pwd.getBytes(); byte b2[] = md.digest( b1 ); //利用md對象把 明文b1[] 加密成 密文b2[] //至此,其實md5加密已經完成,可惜它生成的密文全是字節數據,不是我們通常習慣(看得懂)的16進制的數 //因此還要進一步處理---見demo2()演示 System.out.println( "len:" +b2.length); //永遠是:16 ---md5加密算法中,無論明文數據有多長,密文都是16個字節數據 for ( byte b: b2){ //System.out.print(b+" "); System.out.print(( char )b+ " " ); } System.out.println(); } @Test //把md5生成的密文轉換成我們習慣的方式---與前面相比,怪字符少一些,但還不是16進制 public void demo2() throws Exception{ MessageDigest md = MessageDigest.getInstance( "MD5" ); String pwd= "ewi24343423" ; byte b1[] = pwd.getBytes(); byte b2[] = md.digest( b1 ); //利用md對象把 明文b1[] 加密成 密文b2[] System.out.println( "len:" +b2.length); //永遠是:16 BASE64Encoder en = new BASE64Encoder(); String pwd2 = en.encode(b2); System.out.println(pwd2); } /* * demo2()方法的缺點: * 1. 密文不是我們最習慣的16進制方式 * 2. 所使用的類BASE64Encoder在API中沒有,意味著該類是沒有公開 * 給我們程序員用的,因此它如果變動了,我們是無話可說的即不穩定的! * ---不在接口中,官方是可以隨便更改 */ @Test //自己手動寫代碼,把md5生成的密文轉換成 我們最習慣的16進制方式 public void demo3() throws Exception{ MessageDigest md = MessageDigest.getInstance( "MD5" ); String pwd= "e655656w23" ; byte b1[] = pwd.getBytes(); byte b2[] = md.digest( b1 ); //利用md對象把 明文b1[] 加密成 密文b2[] System.out.println( "len:" +b2.length); //永遠是:16 //手動寫代碼,把16個byte數據 轉換成 32個 16進制數 String pwd2= "" ; for ( byte i: b2){ String s = Integer.toHexString(i & 0xff ); //如果i<16則s只有一位,只有>=16的i轉換成的s才是兩位 if (s.length()== 1 ){ s = "0" +s; // s ="f"+s; } pwd2 +=s; } pwd2 = pwd2.toUpperCase(); System.out.println(pwd2.length()); System.out.println(pwd2); } } |
如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/weixin_37720904/article/details/72809769