mac(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。


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


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


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


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


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


import java.nio.charset.Charset;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
 * MAC消息摘要组件
 *
 * */
public class MACCoder {
    private static final Charset UTF_8 = Charset.forName("UTF-8");

    /**
     * 初始化HmacSHA256的密钥
     * @return byte[] 密钥
     *
     * */
    public static byte[] initHmacSHA256Key() throws Exception{
        //初始化KeyGenerator
        KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacSHA256");
        //产生密钥
        SecretKey secretKey=keyGenerator.generateKey();
        //获取密钥
        return secretKey.getEncoded();
    }

    public static byte[] encodeHmacSHA256_2(byte[] data1,byte[] key) throws Exception{
        SecretKey secretKey=new SecretKeySpec(key,"HmacSHA256");
        Mac mac=Mac.getInstance(secretKey.getAlgorithm());
        mac.init(secretKey);

        mac.update(data1);

        return mac.doFinal();
    }

    /**
     * 进行相关的摘要算法的处理展示
     * @throws Exception
     * **/
    public static void main(String[] args) throws Exception {
        String str="2019-12-09T02:27:42-07:00";
        System.out.println("原文="+str);

        byte[] key=MACCoder.initHmacSHA256Key();
        //byte[] key="0X84NSTAokzW1iWCCLFIzP1JYv1utSUT".getBytes(UTF_8);

        byte[] datas=MACCoder.encodeHmacSHA256_2(str.getBytes(UTF_8), key);
        System.out.println("HmacSHA256的密钥:"+key.toString());
        System.out.println("HmacSHA256算法摘要:"+new String(datas));
        System.out.println();
    }
}

输出:

原文=2019-12-09T02:27:42-07:00
HmacSHA256的密钥:[B@1ff8b8f
HmacSHA256算法摘要:�

--END-- 2019-12-10 10:15

最新文章

  1. angular源码阅读,依赖注入的原理:injector,provider,module之间的关系。
  2. MySQL提示符含义
  3. 源码安装Postgresql9.4.1
  4. 串口发送浮点型数据及int(2个字节)long int(4个字节)的方法
  5. 会话—session
  6. Xamarin自定义布局系列——瀑布流布局
  7. LPC 语言基础
  8. zabbix误报交换机重启
  9. 我的学习目标(目前已初步学习完Java语言基础)
  10. 【Python语言】Python介绍
  11. HashMap是如何工作的
  12. js的字符串代码库及讲解
  13. Spring Cloud(Dalston.SR5)--Zuul 网关-过滤器
  14. openstack(Pike 版)集群部署(五)--- Neutron 部署
  15. native与ascii互转
  16. linux网络编程--网络编程的基本函数介绍与使用【转】
  17. C语言sscanf用法解析与正则表达式支持
  18. 【Codeforces】Codeforces Round #491 (Div. 2) (Contest 991)
  19. WIN7提示“您已使用临时配置文件登陆”的解决方案
  20. makefile之strip函数

热门文章

  1. Django——Xadmin中的功能
  2. Kotlin属性揭秘与延迟初始化特性
  3. java.lang.IllegalArgumentException: No enum constant org.apache.ibatis.type.JdbcType.Integer
  4. memcached的缺点
  5. vue-cli 3 按需引入 element-ui
  6. 创建型模式(四) 建造者\生成器模式(Builder)
  7. Ubuntu安装Apache 2.4.7常见问题解答
  8. 任何人都适合的常用Chrome插件(工欲善其事必先利其器)
  9. django使用redis
  10. Appium环境搭建(Mac)