MD5加密的簡單java實現
阿新 • • 發佈:2019-01-09
1.先大致說一下什麼是MD5加密。MD5的全稱是Message-Digest Algorithm 5(資訊-摘要演算法),看了很多大神的文章,自己有了點理解 ,MD5其實不算是加密演算法,而是一種資訊的摘要。它的特性是不可逆的,所以除了暴力破解 一般逆序演算法是得不到結果的。舉個例子:比如1+99=100,MD5接到的字元是1和99 然後通過自己的演算法最後生成100 但知道結果是100卻很難推測出是通過1+99得來的。再比如 一本書的每一頁取一個字,最後通過計算得出一個MD5碼,但卻很難通過這個MD5碼去推測出這本書的內容。這也就是MD5的不可逆的原因。舉的例子和對MD5的理解僅代表本人自己的觀點,如有錯誤還請各位大神批評指正。
2.這篇文章不討論複雜的MD5的演算法實現,由於本人並非科班出生,只是在專案中要用所以大致使用了一下,具體原理等以後有空閒時間慢慢研究。話不多說,直接上程式碼。
3.分享兩個方法①getMD5() 和 ②MD5(),傳入要加密的字元str,返回加密成功的字元 . 方法①生成的是小寫字母+數字,方法②生成的是大寫字母+數字,方法2要是想得到小寫字母+數字就把hexDigits陣列中的大寫換成小寫。 大小寫可以通過String類的方法處理
package com.nebula.app.app.common.utils; import java.math.BigInteger; import java.security.MessageDigest; public class AppMD5Util { /** * 對字串md5加密(小寫+字母) * * @param str 傳入要加密的字串 * @return MD5加密後的字串 */ public static String getMD5(String str) { try { // 生成一個MD5加密計算摘要 MessageDigest md = MessageDigest.getInstance("MD5"); // 計算md5函式 md.update(str.getBytes()); // digest()最後確定返回md5 hash值,返回值為8為字串。因為md5 hash值是16位的hex值,實際上就是8位的字元 // BigInteger函式則將8位的字串轉換成16位hex值,用字串來表示;得到字串形式的hash值 return new BigInteger(1, md.digest()).toString(16); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 對字串md5加密(大寫+數字) * * @param str 傳入要加密的字串 * @return MD5加密後的字串 */ public static String MD5(String s) { char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; try { byte[] btInput = s.getBytes(); // 獲得MD5摘要演算法的 MessageDigest 物件 MessageDigest mdInst = MessageDigest.getInstance("MD5"); // 使用指定的位元組更新摘要 mdInst.update(btInput); // 獲得密文 byte[] md = mdInst.digest(); // 把密文轉換成十六進位制的字串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { e.printStackTrace(); return null; } } public static void main(String[] args) { String md5 = MD5("password"); String md52 = getMD5("password22"); } }
4.上述方法可直接拿來應急使用 ,建議有時間還是瞭解MD5的實現,拿來主義不靠譜呀,哈哈。