原文鏈接:https://juejin.cn/post/7108546254543519781
MD5加密簡介
哈希算法又稱散列算法,是將任何數(shù)據(jù)轉(zhuǎn)換成固定長度的算法的統(tǒng)稱。 從本質(zhì)上講,MD5也是一種哈希算法,其輸出是生成128位的輸出結(jié)果。 如果輸入兩個不同的明文,就會輸出兩個不同的輸出值,并且根據(jù)輸出值,不能得到原始的明文,這個過程是不可逆的。
MD5加密原理
MD5算法對512位報文的輸入信息進行處理,每個報文被分成16個32位報文。 經(jīng)過一系列處理后,算法的輸出由4個32位的數(shù)據(jù)包組成,這些數(shù)據(jù)包能聯(lián)生成一個128位的哈希值。
在MD5算法中,信息的填寫方式是這樣的:消息后面跟著一個1,然后是無數(shù)個0,直到512字節(jié)的剩余數(shù)等于448 (n*512) + 448。 為什么剩下的是448,因為剩下的512-448是64位,表示填充前的消息長度。 加上剩下的64位,(n+1)乘以512,也就是512的整數(shù)倍。
然后循環(huán)通過link變量獲得結(jié)果。 MD5包含四個32位整數(shù)參數(shù),稱為鏈接變量:A=0x01234567, B= 0x89ABCdef, C= 0xFeDCba98, D=0x76543210。 一旦設置好四個鏈接變量,算法就開始了四輪循環(huán)。 具體的內(nèi)部計算是關(guān)于數(shù)學的。如果你感興趣,你可以自己理解。這里沒有更多的解釋。
MD5加密常用方法
/** * 用MD5算法進行加密 * @param str 需要加密的字符串 * @return MD5加密后的結(jié)果 * @throws UnsupportedEncodingException */ public static String encodeMD5String(String str) { return getMD5(str); }復制代碼 /** * MD5編碼方法, 該方法存在漏洞,特殊情況下編碼后的字符串只有31位長度 * @param str * @param method * @return * @throws UnsupportedEncodingException */private static String encode(String str, String method) throws UnsupportedEncodingException { MessageDigest md = null; String dstr = null; try { md = MessageDigest.getInstance(method); md.update(str.getBytes(“UTF-8”)); dstr = new BigInteger(1, md.digest()).toString(16); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return dstr; }復制代碼/** * MD5編碼方法 * @param message * @return */ public static String getMD5(String message) { MessageDigest messageDigest = null; StringBuffer md5StrBuff = new StringBuffer(); try { messageDigest = MessageDigest.getInstance(“MD5”); messageDigest.reset(); messageDigest.update(message.getBytes(“UTF-8”)); byte[] byteArray = messageDigest.digest(); for (int i = 0; i < byteArray.length; i++) { if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i])); else md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i])); } } catch (Exception e) { throw new RuntimeException(); } return md5StrBuff.toString().toUpperCase();//字母大寫 } 復制代碼 /** * 加密 * @param content * @return */ public static String encrypt(String content) { String password = "12345678dd"; byte[] encryptResult = encrypt(content, password); String encryptResultStr = parseByte2HexStr(encryptResult); return encryptResultStr; }復制代碼/** * 加密 * @param content * @param password * @return */ public static String encryptStr(String content, String password) { byte[] encryptResult = encrypt(content, password); return parseByte2HexStr(encryptResult); }復制代碼/** * 解密 * @param encryptResultStr * @return * @throws UnsupportedEncodingException */ public static String decrypt(String encryptResultStr) throws UnsupportedEncodingException { String password = "12345678dd"; byte[] decryptFrom = parseHexStr2Byte(encryptResultStr); byte[] decryptResult = decrypt(decryptFrom, password); // 解密內(nèi)容進行解碼 String result = new String(decryptResult, UTF8); return result; }復制代碼/** * 解密 * @param encryptStr * @param password * @return * @throws UnsupportedEncodingException */ public static String decryptStr(String encryptStr, String password) throws UnsupportedEncodingException {byte[] decryptFrom = parseHexStr2Byte(encryptStr);byte[] decryptResult = decrypt(decryptFrom, password);// 解密內(nèi)容進行解碼return new String(decryptResult, UTF8); }