java实现HmacSHA256算法进行加密方式

 更新时间:2022年08月18日 11:11:14   作者:MikeTeas  
这篇文章主要介绍了java实现HmacSHA256算法进行加密方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

HmacSHA256算法进行加密

1. 使用HmacSHA256进行数据加密(需要使用秘钥secret)

 public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
        String secret="2131231@#42";
        String message="我加密一下";
        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes("utf-8"), "HmacSHA256");
        sha256_HMAC.init(secretKey);
        byte[] hash = sha256_HMAC.doFinal(message.getBytes("utf-8"));
        String encodeStr = Base64.encodeBase64String(hash);
        String encodeStr16=byte2Hex(hash);
    }

2. 加密后的字节也可以进行转换成16位进制的字符串

/**
     * 将byte转为16进制
     *
     * @param bytes
     * @return
     */
    private static String byte2Hex(byte[] bytes) {
        StringBuffer stringBuffer = new StringBuffer();
        String temp = null;
        for (int i = 0; i < bytes.length; i++) {
            temp = Integer.toHexString(bytes[i] & 0xFF);
            if (temp.length() == 1) {
                //1得到一位的进行补0操作
                stringBuffer.append("0");
            }
            stringBuffer.append(temp);
        }
        return stringBuffer.toString();
    }

注释:MD5算法进行加密的属于比较弱的加密算法,所以要想强一点加密的话可以使用sha256加密算法

HmacSHA256 签名及验签

一个项目需要用到HmacSHA256 对数据进行签名 于是写了个工具类方便以后及大家直接引用。

验签参数

    // 遍历排序后的字典,将所有参数按"keyvalue"格式拼接在一起
    StringBuilder basestring = new StringBuilder();
    for (Map.Entry<String, String> param : entrys) {
        if(!StringUtils.isBlank(param.getValue())) {
            basestring.append(param.getKey());
            basestring.append(param.getValue());
        }
    }
    basestring.append(secret);
    logger.info("basestring is  = {}", basestring);
    // 使用SHA256对待签名串求签
    boolean returnFlag = SignatureUtils.valid(basestring.toString(), secret, userSign);
    if (! returnFlag ) {
        logger.info("user sign error==============sign={},  string={}", clientSign, basestring);
    }

工具代码

//  项目需要对表的数据进行签名
package com.api.common.utils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
public abstract class SignatureUtils {
    private static Logger logger = LogManager.getLogger(SignatureUtils.class);
    private static final String ALGORITHM = "HmacSHA256";
    public static boolean valid(String message, String secret, String signature) {
        return signature != null && signature.equals(sign(message, secret));
    }
    public static String sign(String message, String secret) {
        try {
            Mac hmac = Mac.getInstance(ALGORITHM);
            SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), ALGORITHM);
            hmac.init(secret_key);
            byte[] bytes = hmac.doFinal(message.getBytes());
            logger.info("service sign is "+byteArrayToHexString(bytes));
            return byteArrayToHexString(bytes);
        } catch (Exception ex) {
            logger.error("签名错误:", ex);
        }
        return null;
    }
    private static String byteArrayToHexString(byte[] bytes) {
        StringBuilder hs = new StringBuilder();
        String tempStr;
        for (int index = 0; bytes != null && index < bytes.length; index++) {
            tempStr = Integer.toHexString(bytes[index] & 0XFF);
            if (tempStr.length() == 1)
                hs.append('0');
            hs.append(tempStr);
        }
        return hs.toString().toLowerCase();
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • Springmvc模式上传和下载与enctype对比

    Springmvc模式上传和下载与enctype对比

    这篇文章主要介绍了Springmvc模式上传和下载与enctype对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • java -jar指定端口或配置文件启动jar问题

    java -jar指定端口或配置文件启动jar问题

    这篇文章主要介绍了java -jar指定端口或配置文件启动jar问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 如何使用JAVA调用SHELL

    如何使用JAVA调用SHELL

    这篇文章主要介绍了如何使用JAVA调用SHELL,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 解决Spring MVC中文乱码的编码配置

    解决Spring MVC中文乱码的编码配置

    这篇文章主要为大家介绍了解决SpringMVC中文乱码的编码配置示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Spring @Transactional工作原理详解

    Spring @Transactional工作原理详解

    这篇文章主要介绍了Spring @Transactional工作原理详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Spring Boot整合JWT的实现步骤

    Spring Boot整合JWT的实现步骤

    本文主要介绍了Spring Boot整合JWT,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • SpringBoot配置系统全局异常映射处理

    SpringBoot配置系统全局异常映射处理

    在项目开发中,肯定少不了异常的出现,作为后台开发人员,我们总是在不停的写各种接口提供给前端调用,然而不可避免的,当后台出现BUG时,前端总是丑陋的讲错误信息直接暴露给用户,这样的用户体验想必是相当差的,本文主要讲解异常映射的配置
    2021-06-06
  • 深入理解Java中Filter的作用种类及应用场景

    深入理解Java中Filter的作用种类及应用场景

    Filter(过滤器)是Java Web中的一种重要组件,可以对请求和响应进行拦截处理,对数据进行过滤和处理。Filter可以实现许多功能,如:鉴权、日志记录、字符编码转换、数据压缩、请求重定向等等
    2023-04-04
  • Maven分模块开发与依赖管理和聚合和继承及属性深入详细介绍

    Maven分模块开发与依赖管理和聚合和继承及属性深入详细介绍

    依赖管理是项目管理中非常重要的一环。几乎任何项目开发的时候需要都需要使用到库。而这些库很可能又依赖别的库,这样整个项目的依赖形成了一个树状结构,而随着这个依赖的树的延伸和扩大,一系列问题就会随之产生
    2022-10-10
  • 深入理解Java中的字符串类型

    深入理解Java中的字符串类型

    这篇文章主要介绍了Java中的字符串类型,需要的朋友可以参考下
    2014-02-02

最新评论