MD5即Message-Digest Algorithm 5(信息-摘要算法5),用於確保信息傳輸完整一致。是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言普遍已有MD5實現。將數據(如漢字)運算爲另一固定長度值,是雜湊算法的基礎原理,MD5的前身有MD2、MD3和MD4。
MD5算法具有以下特點:
1、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
2、容易計算:從原數據計算出MD5值很容易。
3、抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所得到的MD5值都有很大區別。
4、強抗碰撞:已知原數據和其MD5值,想找到一個具有相同MD5值的數據(即僞造數據)是非常困難的。
MD5的作用是讓大容量信息在用數字簽名軟件簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的字節串變換成一定長的十六進制數字串)。除了MD5以外,其中比較有名的還有sha-1、RIPEMD以及Haval等。
JAVA中的摘要算法簡單示例:
package com.zhuifeng.util;
import java.security.MessageDigest;
/**
* @author guoxk
*
* @version 創建時間 2016年1月7日 下午1:47:06
*
* 類描述:MD5加密工具類
*
*/
public class MD5Util{
/**
* @author guoxk
*
* 方法描述:MD5加密方法
* @param str 明文
* @param charSet 字符編碼
* @return 密文
*/
public static String MD5(String str,String charSet) {
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
if(charSet==null){
messageDigest.update(str.getBytes());
}else{
messageDigest.update(str.getBytes(charSet));
}
} catch (Exception e) {
e.printStackTrace();
}
byte[] byteArray = messageDigest.digest();
StringBuffer md5StrBuff = new StringBuffer();
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]));
}
return md5StrBuff.toString();
}
/**
* @author guoxk
*
* 方法描述:MD5加密方法 --- UTF-8編碼
* @param s 明文
* @return 密文
*/
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("utf-8");
// 獲得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 password = "ming wen mi ma";
System.out.println("原明文:" + password);
String pw = MD5(password);//默認utf-8編碼加密,32位大寫,
System.out.println("32位大寫UTF-8加密後:" + pw);//C0389AC882DFCCA5592628F139F7A975
String pw2 = MD5(password,"GBK");//自定義編碼加密,32位小寫
System.out.println("32位小寫自定義編碼加密後:" + pw2);//c0389ac882dfcca5592628f139f7a975
}
}