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();
    }
}

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

相关文章

  • 详解Java中的final关键字

    详解Java中的final关键字

    子类可以在父类的基础上改写父类内容,为了避免这种随意改写的情况,Java提供了final 关键字,用于修饰不可改变内容。本文就来详细说说final关键字的使用,需要的可以参考一下
    2022-10-10
  • 基于@RequestMapping 用法详解之地址映射

    基于@RequestMapping 用法详解之地址映射

    这篇文章主要介绍了@RequestMapping 用法详解之地址映射,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringBoot实现权限验证的示例步骤

    SpringBoot实现权限验证的示例步骤

    权限验证是一种用于控制对系统资源和操作的访问的机制。它允许开发人员定义谁可以执行特定操作或访问特定资源,并确保只有经过授权的用户才能执行这些操作,这篇文章主要介绍了SpringBoot实现权限验证,需要的朋友可以参考下
    2023-08-08
  • 使用Spring的注解方式实现AOP实例

    使用Spring的注解方式实现AOP实例

    本篇文章主要介绍了使用Spring的注解方式实现AOP实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • java实现简单的搜索引擎

    java实现简单的搜索引擎

    这篇文章主要为大家详细介绍了java实现简单的搜索引擎的相关资料,需要的朋友可以参考下
    2016-02-02
  • Java并发编程之ConcurrentLinkedQueue源码详解

    Java并发编程之ConcurrentLinkedQueue源码详解

    今天带小伙伴们学习一下Java并发编程之Java ConcurrentLinkedQueue源码,本篇文章详细分析了ConcurrentLinkedQueue源码,有代码示例,对正在学习java的小伙伴们很有帮助哟,需要的朋友可以参考下
    2021-05-05
  • java Socket编程实现I/O多路复用的示例

    java Socket编程实现I/O多路复用的示例

    本文主要介绍了java Socket编程实现I/O多路复用的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • Java实现文件上传与文件下载的示例代码

    Java实现文件上传与文件下载的示例代码

    在开发中项目难免会遇到文件上传和下载的情况,这篇文章主要为大家详细介绍了Java中实现文件上传与文件下载的示例代码,希望对大家有所帮助
    2023-07-07
  • Java语法基础之函数的使用说明

    Java语法基础之函数的使用说明

    函数就是定义在类中的具有特定功能的一段独立小程序,函数也称为方法
    2013-07-07
  • Springboot +redis+谷歌开源Kaptcha实现图片验证码功能

    Springboot +redis+谷歌开源Kaptcha实现图片验证码功能

    这篇文章主要介绍了Springboot +redis+⾕歌开源Kaptcha实现图片验证码功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01

最新评论