java中字串 MD5密碼的加密與驗證
阿新 • • 發佈:2019-02-19
MD5即Message-Digest Algorithm 5(資訊-摘要演算法 5),用於確保資訊傳輸完整一致。是計算機廣泛使用的雜湊演算法之一(又譯摘要演算法、雜湊演算法),主流程式語言普遍已有MD5實現。
2
3
4publicclass Password {
5 //16進位制下數字到字元的對映陣列 6privatestatic String[] hexDigits =new String[] {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
7
8 //將inputstr加密 9publicstatic String createPassword(String inputstr)
10 {
11 return encodeByMD5(inputstr);
12 }13
14 //驗證密碼是否正確 15publicstaticboolean authenticatePassword(String pass , String inputstr)
16 {
17 if(pass.equals((encodeByMD5(inputstr))))
18 {
19 returntrue;
20 }21 else22 {
23 returnfalse;
24 }25 }26 //對字串進行MD5編碼 27privatestatic String encodeByMD5(String originstr)
28 {
29 if(originstr !=null)
30 {
31 try{
32 //建立具有指定演算法名稱的資訊摘要 33 MessageDigest md = MessageDigest.getInstance("MD5");
34 //使用指定的位元組陣列對摘要進行最後的更新,然後完成摘要計算 35byte[] results = md.digest(originstr.getBytes());
36 //將得到的位元組陣列程式設計字串返回 37 String resultString = byteArrayToHexString(results);
38 return resultString.toUpperCase();
39 }catch(Exception ex){
40 ex.printStackTrace();
41 }42 }43 returnnull;
44 }45 //轉換位元組陣列為十六進位制字串 46privatestatic String byteArrayToHexString(byte[] b)
47 {
48 StringBuffer resultsb =new StringBuffer();
49 int i=0;
50 for(i=0;i<b.length;i++)
51 {
52 resultsb.append(byteToHexString(b[i]));
53 }54 return resultsb.toString();
55 }56 //將位元組轉化成十六進位制的字串 57privatestatic String byteToHexString(byte b)
58 {
59
60 int n=b;
61 if(n<0)
62 {
63 n =256+ n;
64 }65 int d1 = n /16;
66 int d2 = n /16;
67 return hexDigits[d1]+hexDigits[d2];
68 }69
70 publicstaticvoid main(String[] args)
71 {
72 String password = Password.createPassword("123456");
73 System.out.println("對123456用MD5加密後:"+password);
74 String inputstr ="1234";
75 System.out.println("1234與密碼相同?"+Password.authenticatePassword(password, inputstr));
76 inputstr ="123456";
77 System.out.println("123456與密碼相同?"+Password.authenticatePassword(password, inputstr));
78 }79}
將資料(如漢字)運算為另一固定長度值是雜湊演算法的基礎原理,MD5的前身有MD2、MD3和MD4。
本例項介紹用MD5進行加密和驗證,將輸入字串通過MD5加密成另一個字串,而且根據新的字串無法獲得原字串,但可以在不知道原始密碼的情況下進行密碼驗證。
關鍵技術:
*通過java.security.MessageDigest的靜態方法getInstance建立具有指定演算法名稱的資訊摘要,引數為演算法名,傳入“MD5”則表示將使用MD5演算法。
*MessageDigest的digest例項方法使用指定的位元組陣列對摘要進行最後更新,然後完成摘要計算,返回存放雜湊值結果的季節陣列,這個陣列就是MD5加密產品。
*將加密後的位元組陣列轉換成十六進位制的字元竄,形成最終的密碼。
*當輸入字串經過MD5加密後,得到的字串與密碼一樣,則認為密碼驗證通過。
例項演示:
1import java.security.MessageDigest;2
3
4publicclass Password {
5 //16進位制下數字到字元的對映陣列 6privatestatic String[] hexDigits =new String[]
7
8 //將inputstr加密 9publicstatic String createPassword(String inputstr)
10 {
11 return encodeByMD5(inputstr);
12 }13
14 //驗證密碼是否正確 15publicstaticboolean authenticatePassword(String pass , String inputstr)
16
17 if(pass.equals((encodeByMD5(inputstr))))
18 {
19 returntrue;
20 }21 else22 {
23 returnfalse;
24 }25 }26 //對字串進行MD5編碼 27privatestatic String encodeByMD5(String originstr)
28 {
29 if(originstr !=null)
30 {
31 try{
32 //建立具有指定演算法名稱的資訊摘要 33 MessageDigest md = MessageDigest.getInstance("MD5");
34 //使用指定的位元組陣列對摘要進行最後的更新,然後完成摘要計算 35byte[] results = md.digest(originstr.getBytes());
36 //將得到的位元組陣列程式設計字串返回 37 String resultString = byteArrayToHexString(results);
38 return resultString.toUpperCase();
39 }catch(Exception ex){
40 ex.printStackTrace();
41 }42 }43 returnnull;
44 }45 //轉換位元組陣列為十六進位制字串 46privatestatic String byteArrayToHexString(byte[] b)
47 {
48 StringBuffer resultsb =new StringBuffer();
49 int i=0;
50 for(i=0;i<b.length;i++)
51 {
52 resultsb.append(byteToHexString(b[i]));
53 }54 return resultsb.toString();
55 }56 //將位元組轉化成十六進位制的字串 57privatestatic String byteToHexString(byte b)
58 {
59
60 int n=b;
61 if(n<0)
62 {
63 n =256+ n;
64 }65 int d1 = n /16;
66 int d2 = n /16;
67 return hexDigits[d1]+hexDigits[d2];
68 }69
70 publicstaticvoid main(String[] args)
71 {
72 String password = Password.createPassword("123456");
73 System.out.println("對123456用MD5加密後:"+password);
74 String inputstr ="1234";
75 System.out.println("1234與密碼相同?"+Password.authenticatePassword(password, inputstr));
76 inputstr ="123456";
77 System.out.println("123456與密碼相同?"+Password.authenticatePassword(password, inputstr));
78 }79}