java mac算法_消息摘要算法-MAC算法系列

一、简述

mac(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。因此MAC算法也经常被称作HMAC算法。关于hmac算法的详情可以参看RFC 2104(http://www.ietf.org/rfc/rfc2104.txt),这里包含了HmacMD5算法的C语言实现。

这里需要说明的是经过mac算法得到的摘要值也可以使用十六进制编码表示,其摘要值得长度与实现算法的摘要值长度相同。例如 HmacSHA算法得到的摘要长度就是SHA1算法得到的摘要长度,都是160位二进制数,换算成十六进制的编码为40位。

二、模型分析

甲乙双方进行数据交换可以采取如下流程完成

1、甲方向乙方公布摘要算法(就是指定要使用的摘要算法名)

2、甲乙双方按照约定构造密钥,双方拥有相同的密钥(一般是一方构造密钥后通知另外一方,此过程不需要通过程序实现,就是双方约定个字符串,但是这个字符串可不是随便设定的,也是通过相关算法获取的)

3、甲方使用密钥对消息做摘要处理,然后将消息和生成的摘要消息一同发送给乙方

4、乙方收到消息后,使用甲方已经公布的摘要算法+约定好的密钥 对收到的消息进行摘要处理。然后比对自己的摘要消息和甲方发过来的摘要消息。甄别消息是否是甲方发送过来的

三、MAC系列算法支持表

算法

摘要长度

备注

HmacMD5

128

JAVA6实现

HmacSHA1

160

JAVA6实现

HmacSHA256

256

JAVA6实现

HmacSHA384

384

JAVA6实现

HmacSHA512

512

JAVA6实现

HmacMD2

128

BouncyCastle实现

HmacMD4

128

BouncyCastle实现

HmacSHA224

224

BouncyCastle实现

四、sun以及bouncycastle的hmac算法实现

package com.ca.test;

import Java.security.Security;

import javax.crypto.KeyGenerator;

import javax.crypto.Mac;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import org.bouncycastle.util.encoders.Hex;

/**

* MAC消息摘要组件

* @author kongqz

* */

public class MACCoder {

///HmacMD5///

/**

* 初始化HmacMD5的密钥

* @return byte[] 密钥

*

* */

public static byte[] initHmacMD5Key() throws Exception{

//初始化KeyGenerator

KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacMD5");

//产生密钥

SecretKey secretKey=keyGenerator.generateKey();

//获取密钥

return secretKey.getEncoded();

}

/**

* HmacMD5消息摘要

* @param data 待做摘要处理的数据

* @param key 密钥

* @return byte[] 消息摘要

* */

public static byte[] encodeHmacMD5(byte[] data,byte[] key) throws Exception{

//还原密钥,因为密钥是以byte形式为消息传递算法所拥有

SecretKey secretKey=new SecretKeySpec(key,"HmacMD5");

//实例化Mac

Mac mac=Mac.getInstance(secretKey.getAlgorithm());

//初始化Mac

mac.init(secretKey);

//执行消息摘要处理

return mac.doFinal(data);

}

///HmacSHA1//

/**

* 初始化HmacSHA1的密钥

* @return byte[] 密钥

*

* */

public static byte[] initHmacSHAKey() throws Exception{

//初始化KeyGenerator

KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacSHA1");

//产生密钥

SecretKey secretKey=keyGenerator.generateKey();

//获取密钥

return secretKey.getEncoded();

}

/**

* HmacSHA1消息摘要

* @param data 待做摘要处理的数据

* @param key

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值