JAVA中簡單的MD5加密類(MD5Utils)

本文轉載自: https://www.cnblogs.com/cqy1183344265/p/5851456.html 作者:CQY1183344265 轉載請註明該聲明。
MD5加密分析:
 
JDK API:
 
獲取對象的API:
 
加密的API:
 
 1 package cn.utils;
 2 
 3 import java.security.MessageDigest;
 4 import java.security.NoSuchAlgorithmException;
 5 
 6 /**
 7  * @author CQY13 MD5加密工具類
 8  */
 9 public class MD5Utils {
10 
11     /**
12      * 獲取MD5加密
13      * 
14      * @param pwd
15      *            需要加密的字符串
16      * @return String字符串 加密後的字符串
17      */
18     public static String getPwd(String pwd) {
19         try {
20             // 創建加密對象
21             MessageDigest digest = MessageDigest.getInstance("md5");
22 
23             // 調用加密對象的方法,加密的動作已經完成
24             byte[] bs = digest.digest(pwd.getBytes());
25             // 接下來,我們要對加密後的結果,進行優化,按照mysql的優化思路走
26             // mysql的優化思路:
27             // 第一步,將數據全部轉換成正數:
28             String hexString = "";
29             for (byte b : bs) {
30                 // 第一步,將數據全部轉換成正數:
31                 // 解釋:爲什麼採用b&255
32                 /*
33                  * b:它本來是一個byte類型的數據(1個字節) 255:是一個int類型的數據(4個字節)
34                  * byte類型的數據與int類型的數據進行運算,會自動類型提升爲int類型 eg: b: 1001 1100(原始數據)
35                  * 運算時: b: 0000 0000 0000 0000 0000 0000 1001 1100 255: 0000
36                  * 0000 0000 0000 0000 0000 1111 1111 結果:0000 0000 0000 0000
37                  * 0000 0000 1001 1100 此時的temp是一個int類型的整數
38                  */
39                 int temp = b & 255;
40                 // 第二步,將所有的數據轉換成16進制的形式
41                 // 注意:轉換的時候注意if正數>=0&&<16,那麼如果使用Integer.toHexString(),可能會造成缺少位數
42                 // 因此,需要對temp進行判斷
43                 if (temp < 16 && temp >= 0) {
44                     // 手動補上一個「0」
45                     hexString = hexString + "0" + Integer.toHexString(temp);
46                 } else {
47                     hexString = hexString + Integer.toHexString(temp);
48                 }
49             }
50             return hexString;
51         } catch (NoSuchAlgorithmException e) {
52             // TODO Auto-generated catch block
53             e.printStackTrace();
54         }
55         return "";
56     }
57 
58     /**
59      * @param args
60      */
61     public static void main(String[] args) {
62         String pwd = MD5Utils.getPwd("abc");
63         System.out.println(pwd);
64     }
65 
66 }