查漏補缺之MD5Utils
參考文章:https://www.cnblogs.com/CQY1183344265/p/5851456.html
MD5的全稱是Message-Digest Algorithm5(資訊-摘要演算法),MD5演算法簡單來說就是把任意長度的字串變換成固定長度(通常是128位)的十六進位制字串。在儲存密碼過程中,直接儲存明文密碼是很危險的,因此在儲存密碼過程中,直接儲存明文密碼。
在MD5Utils類中,建立一個md5()方法對密碼進行加密。首先通過MessageDigest的getInstanc()方法獲取資料加密物件digest,然後通過該物件的digest()方法對密碼進行加密。
/** * MD5的全稱是Message-Digest Algorithm5(資訊-摘要演算法), * MD5演算法簡單來說就是把任意長度的字串變換成固定長度(通常是128位)的十六進位制字串。 * 在儲存密碼過程中,直接儲存明文密碼是很危險的, * 因此在儲存密碼過程中,直接儲存明文密碼。 * Created by Jenny on 2019/2/19. */ public class MD5Utils { /** * MD5加密的演算法 */ public static String md5(String text){ MessageDigest digest = null; try { // 建立加密物件 digest = MessageDigest.getInstance("md5"); // 呼叫加密物件的方法,加密的動作已經完成 byte[] result = digest.digest(text.getBytes()); // 接下來,我們要對加密後的結果,進行優化,按照mysql的優化思路走 // mysql的優化思路: // 第一步,將資料全部轉換成正數: StringBuilder sb = new StringBuilder(); for (byte b:result){ // 第一步,將資料全部轉換成正數: // 解釋:為什麼採用b&255 /* * b:它本來是一個byte型別的資料(1個位元組) 255:是一個int型別的資料(4個位元組) * byte型別的資料與int型別的資料進行運算,會自動型別提升為int型別 eg: b: 1001 1100(原始資料) * 運算時: b: 0000 0000 0000 0000 0000 0000 1001 1100 255: 0000 * 0000 0000 0000 0000 0000 1111 1111 結果:0000 0000 0000 0000 * 0000 0000 1001 1100 此時的temp是一個int型別的整數 */ int number = b & 0xff; // 第二步,將所有的資料轉換成16進位制的形式 // 注意:轉換的時候注意if正數>=0&&<16,那麼如果使用Integer.toHexString(),可能會造成缺少位數 // 因此,需要對temp進行判斷 String hex = Integer.toHexString(number); if (hex.length() == 1){ sb.append("0" + hex); }else { sb.append(hex); } } return sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return ""; } } }