MD5加密的簡(jiǎn)單java實(shí)現(xiàn)

1.先大致說(shuō)一下什么是MD5加密。
MD5的全稱(chēng)是Message-Digest Algorithm 5(信息-摘要算法),看了很多大神的文章,自己有了點(diǎn)理解 ,MD5其實(shí)不算是加密算法,而是一種信息的摘要。它的特性是不可逆的,所以除了暴力破解 一般逆序算法是得不到結(jié)果的。
舉個(gè)例子:比如1+99=100,MD5接到的字符是1和99 然后通過(guò)自己的算法最后生成100 但知道結(jié)果是100卻很難推測(cè)出是通過(guò)1+99得來(lái)的。再比如 一本書(shū)的每一頁(yè)取一個(gè)字,最后通過(guò)計(jì)算得出一個(gè)MD5碼,但卻很難通過(guò)這個(gè)MD5碼去推測(cè)出這本書(shū)的內(nèi)容。這也就是MD5的不可逆的原因。舉的例子和對(duì)MD5的理解僅代表本人自己的觀(guān)點(diǎn),如有錯(cuò)誤還請(qǐng)各位大神批評(píng)指正。
2.這篇文章不討論復(fù)雜的MD5的算法實(shí)現(xiàn),由于本人并非科班出生,只是在項(xiàng)目中要用所以大致使用了一下,具體原理等以后有空閑時(shí)間慢慢研究。話(huà)不多說(shuō),直接上代碼。
3.分享兩個(gè)方法①getMD5() 和? ②MD5(),傳入要加密的字符str,返回加密成功的字符.??
方法①生成的是小寫(xiě)字母+數(shù)字;
方法②生成的是大寫(xiě)字母+數(shù)字,方法2要是想得到小寫(xiě)字母+數(shù)字就把hexDigits數(shù)組中的大寫(xiě)換成小寫(xiě)。 大小寫(xiě)可以通過(guò)String類(lèi)的方法處理
package com.nebula.app.app.common.utils;
?
import java.math.BigInteger;
import java.security.MessageDigest;
?
public class AppMD5Util {
/**
? ? ?* 對(duì)字符串md5加密(小寫(xiě)+字母)
? ? ?*
? ? ?* @param str 傳入要加密的字符串
? ? ?* @return? MD5加密后的字符串
? ? ?*/
? ? public static String getMD5(String str) {
? ? ? ? try {
? ? ? ? ? ? // 生成一個(gè)MD5加密計(jì)算摘要
? ? ? ? ? ? MessageDigest md = MessageDigest.getInstance("MD5");
? ? ? ? ? ? // 計(jì)算md5函數(shù)
? ? ? ? ? ? md.update(str.getBytes());
? ? ? ? ? ? // digest()最后確定返回md5 hash值,返回值為8為字符串。因?yàn)閙d5 hash值是16位的hex值,實(shí)際上就是8位的字符
? ? ? ? ? ? // BigInteger函數(shù)則將8位的字符串轉(zhuǎn)換成16位hex值,用字符串來(lái)表示;得到字符串形式的hash值
? ? ? ? ? ? return new BigInteger(1, md.digest()).toString(16);
? ? ? ? } catch (Exception e) {
? ? ? ? ? ?e.printStackTrace();
? ? ? ? ? ?return null;
? ? ? ? }
? ? }
? ??
? ??
? ? /**
? ? ?* 對(duì)字符串md5加密(大寫(xiě)+數(shù)字)
? ? ?*
? ? ?* @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 對(duì)象
? ? ? ? ? ? MessageDigest mdInst = MessageDigest.getInstance("MD5");
? ? ? ? ? ? // 使用指定的字節(jié)更新摘要
? ? ? ? ? ? mdInst.update(btInput);
? ? ? ? ? ? // 獲得密文
? ? ? ? ? ? byte[] md = mdInst.digest();
? ? ? ? ? ? // 把密文轉(zhuǎn)換成十六進(jìn)制的字符串形式
? ? ? ? ? ? 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.上述方法可直接拿來(lái)應(yīng)急使用 ,建議有時(shí)間還是了解MD5的實(shí)現(xiàn),拿來(lái)主義不靠譜呀,哈哈。