Java实现hmacsha1加密算法的完整代码

 更新时间:2026年06月28日 09:51:59   作者:考虑考虑  
HMAC是一种利用加密哈希函数结合密钥来验证消息完整性和真实性的机制,HMAC-SHA1 使用 SHA-1 作为底层哈希函数,输出长度为 160 位(20 字节) 的摘要,下面我们就来看看如何使用Java实现hmacsha1加密算法吧

前言

Java本身就自带加密算法实现,实现hmacsha1加密算法,可以利用本身自带的方法

什么是 HMAC-SHA1?

HMAC(Hash‑based Message Authentication Code,基于哈希的消息认证码)是一种利用加密哈希函数结合密钥来验证消息完整性和真实性的机制。HMAC-SHA1 使用 SHA-1 作为底层哈希函数,输出长度为 160 位(20 字节) 的摘要。

核心特点:

  • 需要共享密钥(对称密钥),发送方和接收方必须持有相同的密钥。
  • 既能验证数据完整性(确保未被篡改),又能验证来源真实性(持有密钥的合法发送者)。
  • 抗碰撞性依赖 SHA-1,但由于 SHA-1 已被证明存在理论碰撞攻击,HMAC-SHA1 在特定场景下仍可使用,但安全性弱于 HMAC-SHA256 或 HMAC-SHA512

典型应用:

  • API 请求签名(如 OAuth 1.0、AWS S3 签名)。
  • JWT 的部分签名算法(但现代 JWT 多采用 HS256)。
  • 消息校验和、数据完整性保护。

hmacsha1加密算法实现

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class SignatureGenerator {
    public static void main(String[] args) {
        String username = "tIsMUhEc0tp&ee050d34cabc|sdkappid=20250616;random=0";
        String deviceSecret = "dARYgMURsw0pAV1w";
        // 1. 将签名类型标识改为 hmacsha1
        String signatureType = "hmacsha1"; 

        try {
            // 2. 将算法实例改为 HmacSHA1
            Mac mac = Mac.getInstance("HmacSHA1");
            SecretKeySpec secretKeySpec = new SecretKeySpec(
                    deviceSecret.getBytes(StandardCharsets.UTF_8), 
                    "HmacSHA1" // 3. 密钥规范也需同步改为 HmacSHA1
            );
            mac.init(secretKeySpec);
            byte[] hmacBytes = mac.doFinal(username.getBytes(StandardCharsets.UTF_8));

            // 使用标准 Base64 编码
            String signature = Base64.getEncoder().encodeToString(hmacBytes);

            // 拼接 password
            String password = signature + ";" + signatureType;
            System.out.println("Password: " + password);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出结果为

知识扩展

Java 实现 HMAC-SHA1 的核心步骤

Java 标准库提供了 javax.crypto.Mac 类,可以方便地实现 HMAC 算法,无需任何第三方依赖。

1. 算法名称

"HmacSHA1"(注意大小写)。

2. 核心 API

  • Mac.getInstance(String algorithm):获取 Mac 实例。
  • SecretKeySpec:将密钥字节包装为 Key 对象。
  • mac.init(Key key):初始化。
  • mac.doFinal(byte[] input):计算最终摘要。
  • mac.update(byte[] input):增量更新数据。

3. 输出格式

原始结果为 byte[](20 字节),通常转换为十六进制字符串或 Base64 字符串以便传输。

完整代码示例

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class HMACSHA1Example {
    /**
     * 计算 HMAC-SHA1 摘要,返回十六进制字符串
     */
    public static String hmacSha1Hex(String key, String message) throws Exception {
        byte[] hmacBytes = hmacSha1(key, message);
        return bytesToHex(hmacBytes);
    }
    /**
     * 计算 HMAC-SHA1 摘要,返回 Base64 字符串
     */
    public static String hmacSha1Base64(String key, String message) throws Exception {
        byte[] hmacBytes = hmacSha1(key, message);
        return Base64.getEncoder().encodeToString(hmacBytes);
    }
    /**
     * 计算 HMAC-SHA1 摘要,返回原始字节数组
     */
    public static byte[] hmacSha1(String key, String message) throws Exception {
        // 1. 获取 Mac 实例
        Mac mac = Mac.getInstance("HmacSHA1");
        // 2. 创建密钥规范(使用 UTF-8 编码)
        SecretKeySpec keySpec = new SecretKeySpec(
            key.getBytes(StandardCharsets.UTF_8), 
            "HmacSHA1"
        );
        // 3. 初始化
        mac.init(keySpec);
        // 4. 执行计算
        return mac.doFinal(message.getBytes(StandardCharsets.UTF_8));
    }
    /**
     * 字节数组转十六进制(小写)
     */
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b & 0xff));
        }
        return sb.toString();
    }
    // 测试
    public static void main(String[] args) throws Exception {
        String key = "secret_key";
        String message = "Hello, HMAC-SHA1!";
        byte[] raw = hmacSha1(key, message);
        String hex = hmacSha1Hex(key, message);
        String base64 = hmacSha1Base64(key, message);
        System.out.println("原始字节长度: " + raw.length);   // 20
        System.out.println("十六进制: " + hex);              // 例如:c2e7b7e5...
        System.out.println("Base64: " + base64);            // 例如:wue35...
    }
}

进阶用法:增量更新(流式处理)

如果消息较大,可以分块多次调用 update(),最后再调用 doFinal() 获取最终结果。

public static byte[] hmacSha1Incremental(String key, String[] parts) throws Exception {
    Mac mac = Mac.getInstance("HmacSHA1");
    SecretKeySpec keySpec = new SecretKeySpec(
        key.getBytes(StandardCharsets.UTF_8), 
        "HmacSHA1"
    );
    mac.init(keySpec);
    for (String part : parts) {
        mac.update(part.getBytes(StandardCharsets.UTF_8));
    }
    return mac.doFinal(); // 无参数,返回前面所有 update 的总和
}

总结

Java本身就自带加密算法实现,实现hmacsha1加密算法,可以利用本身自带的方法

到此这篇关于Java实现hmacsha1加密算法的完整代码的文章就介绍到这了,更多相关Java hmacsha1加密算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java打包成可执行的jar或者exe的详细步骤

    java打包成可执行的jar或者exe的详细步骤

    Java程序完成以后,对于Windows操作系统,习惯总是想双击某个exe文件就可以直接运行程序,现我将一步一步的实现该过程.最终结果是:不用安装JRE环境,不用安装数据库,直接双击一个exe文件,就可以运行程序
    2014-04-04
  • java编写创建数据库和表的程序

    java编写创建数据库和表的程序

    这篇文章主要为大家详细介绍了java编写创建数据库和表的程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Java事务@Transactional 、@GlobalTransactional使用步骤

    Java事务@Transactional 、@GlobalTransactional使用步骤

    这篇文章主要介绍了使用@Transactional和@GlobalTransactional注解进行事务管理的区别和应用场景,@Transactional用于单个服务内的本地事务管理,而@GlobalTransactional用于跨服务的分布式事务管理,文中给出了详细的代码示例,需要的朋友可以参考下
    2025-05-05
  • Java数据结构贪心算法的实现

    Java数据结构贪心算法的实现

    本文主要介绍了Java数据结构贪心算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2007-03-03
  • java复制文件的4种方式及拷贝文件到另一个目录下的实例代码

    java复制文件的4种方式及拷贝文件到另一个目录下的实例代码

    这篇文章主要介绍了java复制文件的4种方式,通过实例带给大家介绍了java 拷贝文件到另一个目录下的方法,需要的朋友可以参考下
    2018-06-06
  • Java实现简易计算器(逆波兰表达式)

    Java实现简易计算器(逆波兰表达式)

    这篇文章主要为大家详细介绍了Java实现简易计算器,逆波兰表达式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • java实现学生信息录入界面

    java实现学生信息录入界面

    这篇文章主要为大家详细介绍了java实现学生信息录入界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 浅谈Android开发中项目的文件结构及规范化部署建议

    浅谈Android开发中项目的文件结构及规范化部署建议

    这篇文章主要介绍了Android开发中项目的文件结构及规范化部署建议,组织好代码文件的结构有利于维护团队合作的效率,需要的朋友可以参考下
    2016-03-03
  • SpringMVC实现用户登录全过程

    SpringMVC实现用户登录全过程

    这篇文章主要介绍了SpringMVC实现用户登录全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • Java switch case语句的用法及常见问题

    Java switch case语句的用法及常见问题

    这篇文章主要介绍了Java switch case语句的用法及常见问题,Java中的switch语句是一种多分支选择结构,用于替代多个if...elseif的情况,它根据某个变量的值,执行匹配分支中的代码块,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-04-04

最新评论