Hmac算法

什么是Hmac算法?

 

Hmac算法就是一种基于密钥的消息认证码算法,是一种更安全的消息摘要算法。
Hmac算法总是和某种哈希算法配合起来用的。例如HmacMD5算法即Hmac+MD5。

  • 使用HmacMD5而不是用MD5加salt,有如下好处
  1. HmacMD5使用的key长度是64字节,更安全;
  2. Hmac是标准算法,同样适用于SHA-1等其他哈希算法;
  3. Hmac输出和原有的哈希算法长度一致。

步骤 

  1. 产生秘钥并保存字节数组和字符串
  2. 创建Hmac加密算法对象,初始化秘钥,加入原数据进行加密
  3. 将加密结果放入字节数组

(1)HmacMD5算法

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;

public class Main {
	public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {
		String passWord = "wbjxxmy";
		//1.产生秘钥
		//获取HmacMD5秘钥生成器
		KeyGenerator generator = KeyGenerator.getInstance("HmacMD5");
		
		//生成秘钥
		SecretKey s = generator.generateKey();
		System.out.println("秘钥的(字节数组):"+Arrays.toString(s.getEncoded()));
		System.out.println("秘钥的(16进制字符串)"+HashTools.bytesToHex(s.getEncoded()));
		
		//2使用秘钥进行加密
		//获取Hmac加密算法对象
		Mac mac =Mac.getInstance("HmacMD5");
		mac.init(s);//初始化秘钥
		mac.update(passWord.getBytes());//更新原始加密内容
		
		//3.加密处理并获取加密结果
		byte[] by =mac.doFinal();
		
		System.out.println("加密处理后的(字节数组):"+Arrays.toString(by));
		System.out.println("加密处理后的(16进制字符串):"+HashTools.bytesToHex(by));
	}
}

(2)通过密钥的字节数组,恢复密钥

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
//按照字节数组,恢复Hmac秘钥
public class Main {
	public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {
		String passWord = "wbjxxmy";//原始密码
		
		//秘钥(字节数组)
		byte[] by = {-28, -112, -19, 41, -43, -89, -119, -6, 79, -102, 104, 52, 24, 16, -105, 60, 58, 124, -6, -24, 32, 29, -20, -123, -18, 38, 93, -2, 85, 51, -117, -96, -118, -127, -57, -79, -18, -57, -10, 102, 25, 11, 95, -32, -25, -112, 8, -4, -54, 117, 13, -32, 24, -52, 5, 80, 46, -126, -41, 4, -25, 80, -76, 124};
	
		//1.恢复秘钥(字节数组)
		SecretKey key =new SecretKeySpec(by, "HmacMD5");
		
		//2.创建Hmac加密算法对象
		Mac mac = Mac.getInstance("HmacMD5");
		mac.init(key);//初始化密钥
		mac.update(passWord.getBytes());//加入原数据
		
		//3.将得到的秘钥结果存入字符串
		String s = HashTools.bytesToHex(mac.doFinal());
		
		System.out.println(s);		
	}
}

(3)通过密钥的字符串,恢复密钥

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
//按照字符串,恢复Hmac秘钥
public class Main {
	public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {
		String passWord = "wbjxxmy";//原始密码
		
		byte[] by = new byte[64];
		//秘钥(字符串)
		String s1 = "0e659dbb23b5287316537dd4c9c1b7cf871f7abd42ef93fee47afa3c102aff1dbe06974217383b7cb7199ff1b4875320f04630f473efeda17db96b6a502f9c17";
		for(int i =0,k=0;i<s1.length();i+=2,k++) {
		String s = s1.substring(i,i+2);
		//将16进制的字符串s转换为字节
		by[k] = (byte) Integer.parseInt(s,16);
		}

		//1.恢复秘钥(字节数组)
		SecretKey key =new SecretKeySpec(by, "HmacMD5");
		
		//2.创建Hmac加密算法对象
		Mac mac = Mac.getInstance("HmacMD5");
		mac.init(key);//初始化密钥
		mac.update(passWord.getBytes());//加入原数据
		
		//3.将得到的秘钥结果存入字符串
		String s = HashTools.bytesToHex(mac.doFinal());
		
		System.out.println(s);		
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lcannal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值