消息摘要算法 - MD5

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 完成消息摘要处理是一个不错的选择,支持多种形式的参数,支持十六进制字符串的摘要信息。

 

 

 

 

转载于:https://my.oschina.net/u/1387400/blog/1504411

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值