1、简述
消息摘要算法包含 MD、SHA 和 MAC共3大系列,常用于验证数据的完整性(数字签名)。
任何消息经过 散列函数 处理后,都会获得唯一的散列值,这个过程称为 "消息摘要";其散列值称为“数字指纹”,自然其算法就是 “消息摘要算法(又称为:散列算法)”了;换句话,如果其数字指纹唯一,就说明其消息是一致的。通常,为了方便人们识别和阅读,数字指纹 常以十六进制字符串的形式出现。
2、安全性
消息摘要算法其核心在于散列函数的单向性,即通过散列函数可获得对应的散列值,但不可通过该散列值反推其原始信息。这个是消息摘要算法的安全性的根本所在。
3、分类
主要有:MD(Message Digest,消息摘要算法)、SHA(Secure Hash Algorithm,安全散列算法)、MAC(Message Authentication Code, 消息认证码算法)。
4、MD5算法
介绍:获取一个随机长度的信息并产生一个128位的信息摘要,再将这个 128 位的 2进制摘要转换为 十六进制,便可以得到一个32位的字符串(每4位二进制转换为1位十六进制数),因此,外面见到的大部分 MD5算法的数字指纹都是 32位 十六进制的字符串。
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.codec.digest.DigestUtils;
public class MDCoder {
public static void main(String[] args) {
String code1 = "md5消息摘要";
String str1 = getSunMd5(code1);
String str2 = getSunMd5(code1);
System.out.println(code1 + "-md5加密后:" + str1);
System.out.println(code1 + "-md5加密后:" + str2);
System.out.println(code1 + "-md5加密后长度:" + str2.length());
System.out.println("--------------------------");
String ss = getCommonCodecMd5(code1);
System.out.println(code1 + "-md5 common 加密:" + ss.toUpperCase());
/** console 结果:
* md5消息摘要-md5加密后:689FFEAE72A4A2864F4A5B73EB60EC4D
md5消息摘要-md5加密后:689FFEAE72A4A2864F4A5B73EB60EC4D
md5消息摘要-md5加密后长度:32
--------------------------
md5消息摘要-md5 common 加密:689FFEAE72A4A2864F4A5B73EB60EC4D
**/
}
/**
* sun 自带md5 加密
* @param code
* @return
*/
public static String getSunMd5(String code){
try {
StringBuffer sb = new StringBuffer();
MessageDigest md = MessageDigest.getInstance("md5");
byte[] array = md.digest(code.getBytes("utf-8"));
for (int i = 0; i < array.length; i++) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).toUpperCase().substring(1, 3));
}
return new String(sb);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* Commons Codec org.apache.commons.codec 工具包
* @param source
* @return
*/
public static String getCommonCodecMd5(String source){
try {
String ss = DigestUtils.md5Hex(source.getBytes("utf-8"));
return ss;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
}
区别说明:sun 提供的算法实现较为底层,支持 md2 和 md5 两种算法,但是缺少相应的进制转换实现,不能将其字节数组形式的摘要信息转换为十六进制字符串,有些不方便;Commons Codec 完成消息摘要处理是一个不错的选择,支持多种形式的参数,支持十六进制字符串的摘要信息。