java 之 数字摘要

MD5:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 数字摘要 可比 指纹
 * MD5 16byte
 * SHA 20byte
 * 有以上两种算法
 * @author ETHAN
 *
 */
public class MD5Test {

	/**
	 * @param args
	 * @throws NoSuchAlgorithmException 
	 */
	public static void main(String[] args) throws NoSuchAlgorithmException {
		// TODO Auto-generated method stub
	
		String result = toHex(md5("ethan"));
		System.out.println(result);
	}
	
	//通常是把 二进制数据转化为 十六进制,便于查看
	//128 bit
	private static byte[] md5(String src) throws NoSuchAlgorithmException {
		
		MessageDigest digest = MessageDigest.getInstance("MD5");
		digest.update(src.getBytes());
		//返回16bytes字节数组 都是1 0 二进制数据
		byte[] results = digest.digest();
		//digest.digest("ethan".getBytes());
		System.out.println(results.length);
		return results;
	}
	
	private static String toHex(byte[] buffer) {
		//线程安全的
		StringBuilder sb = new StringBuilder();
		
		for(int i=0;i<buffer.length;i++) {
			//一个字节 8 bit 向右移4位,取得高四位,根据高位补位,是1就全补1
			int hi = ((buffer[i]>>4)&0x0f);
			int lo = buffer[i] & 0x0f;
			
			//字符串 和 数字相加 会自动转换为数字
			//10-10+a = a
			sb.append(hi>9?(char)((hi-10)+'a'):(char)(hi+'0'));
			//低四位
			sb.append(lo>9?(char)((lo-10)+'a'):(char)(lo+'0'));
		}
		return sb.toString();
	}
}

MAC:

import java.security.NoSuchAlgorithmException;

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;

/**
 * 基于MAC(消息验证码)的数字摘要
 * message authentication code,密钥被用作生成消息摘要的一部分
 * 防止内容和摘要同时被篡改,在一定程度上起到了验证发送者身份
 * @author ETHAN
 *
 */
public class MACTest {

	/**
	 * @param args
	 * @throws NoSuchAlgorithmException 
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		//密码
		PBEKeySpec keySpec = new PBEKeySpec("ethan".toCharArray());
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
		SecretKey key = keyFactory.generateSecret(keySpec);
		
		Mac mac = Mac.getInstance("HmacMD5");//算法
		//验证者需要同样的密钥密码"ethan".toCharArray()
		mac.init(key);
		//内容
		byte[] src= new byte[] {1,2,3,5};
		//产生的摘要
		byte[] dest = mac.doFinal(src);
		
		System.out.println(dest.length);
		
		for(int i=0;i<dest.length;i++) {
			System.out.println(dest[i]+".");
		}
	}

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值