JDK1.5 java代码打包jar HmacSha256

文章目录

demo地址

https://github.com/xiangge-zx/HmacSha256

背景

最近接到一个需求,做一个可以用来HmacSha256加密的小工具,感觉可以很轻松搞出来,没想到一个前置要求是要使用jdk1.5版本,遇到了不少问题,记录一下最终的解决方案。

实现

编写代码

  • 代码
java 复制代码
package com.xuan.it;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

public class HmacSha256 {
    public static String hmacSHA256(String data, String secret) {
        try {
            // Create HMAC-SHA256 key from the given secret
            SecretKeySpec secretKeySpec = new SecretKeySpec(secret.getBytes(), "HmacSHA256");

            // Get an instance of Mac object implementing HMAC-SHA256
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(secretKeySpec);

            // Calculate the HMAC value
            byte[] hmacBytes = mac.doFinal(data.getBytes());

            // Convert result into a hexadecimal string
            StringBuilder sb = new StringBuilder(hmacBytes.length * 2);
            for (byte b : hmacBytes) {
                sb.append(String.format("%02x", b));
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            throw new RuntimeException("Failed to calculate HMAC-SHA256", e);
        }
    }

    public static void main(String[] args) {
        if (args.length != 2) {
            System.out.println("Please provide two integers as arguments.");
            return;
        }
        try {
            String message = args[0];
//            String message = "0";
            String secret = args[1];
//            String secret = "1";

            String hmacSha256Hex = hmacSHA256(message, secret);
            System.out.println(hmacSha256Hex);
        } catch (NumberFormatException e) {
            System.out.println("The arguments must be integers.");
        }
    }

}

编译class文件

进到 \HmacSha256-jdk5\src> 目录

先检查java命令版本 确认配置的是java 1.5

shell 复制代码
HmacSha256-jdk5\src> java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-b64)
Java HotSpot(TM) Client VM (build 1.5.0-b64, mixed mode, sharing)

HmacSha256\HmacSha256-jdk5\src> javac .\HmacSha256.java

打包 JAR 文件

  • 在 JDK 1.5 中,运行以下 jar 命令将文件打包成 JAR 文件,还是在进到class文件所在的目录,编译后的 .class 文件为 HmacSha256.class

    jar cvf HmacSha256-jdk5.jar .\HmacSha256.class
    

在上述命令中,cvfjar 命令的参数,用于指定不同的操作和选项。以下是每个参数的含义:

  • c:表示创建新的 JAR 文件。
  • v:表示在标准输出中生成详细输出,即显示创建 JAR 文件的详细过程。
  • f:表示指定 JAR 文件的名称。在这种情况下,HmacSha256-jdk5.jar 是要创建的 JAR 文件的名称。

执行生成的 JAR 文件

如果你想直接调用 HmacSha256 类中的 main 方法,你可以通过反射来实现。在你的 shell 脚本中,你可以使用以下命令来执行该操作:

bash 复制代码
java -cp HmacSha256-jdk5.jar HmacSha256 0 1

在这个命令中:

  • -cp HmacSha256-1.0.jar 指定了类路径,告诉 Java 虚拟机在哪里找到 HmacSha256 类。
  • HmacSha256 是你要执行的类名。
  • 后面的参数 0 1会作为main方法的参数传递给HmacSha256` 类。

比对结果和预期一致 https://www.jyshare.com/crypto/hmacsha256/

辅助验证方式

windows脚本验证jar中的class版本

shell 复制代码
javap -verbose -classpath .\HmacSha256-jdk6.jar HmacSha256

常见问题和解决方法

  • 找不到或无法加载主类 :这通常是由于 MANIFEST.MF 文件中指定的主类信息有误导致的。确保 MANIFEST.MF 文件中指定的主类路径和名称是正确的,或者通过-cp参数指定类路径
  • 缺少依赖:如果 JAR 文件依赖于其他库或 JAR 文件,确保这些依赖文件也在类路径中,确保这些库的版本与您的应用程序兼容
  • 权限问题:在某些系统上可能需要管理员权限才能执行 JAR 文件,您可以尝试以管理员身份运行命令行。
  • Java 版本 :确保您使用的 Java 运行时环境版本与编译 JAR 文件时使用的 Java 版本兼容。有时候,使用较新版本的 Java 编译的 JAR 文件可能无法在较旧版本的 Java 运行时环境中正常运行。这也是这篇文章出现的原因,目标环境只能执行jdk1.5版本的代码

常规生成jar方案

maven插件

maven插件还是目前最常用的方式,这里简单写了一个demo在仓库中
https://github.com/xiangge-zx/HmacSha256

idea工具

基于idea的打包方式也是很常用的方法,这个方式最低需要1.6版本的jdk

相关推荐
w_3123454几秒前
自定义一个maven骨架 | 最佳实践
java·maven·intellij-idea
岁岁岁平安3 分钟前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA6 分钟前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
Q_192849990613 分钟前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
张国荣家的弟弟31 分钟前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S42 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos1 小时前
C++----------函数的调用机制
java·c++·算法
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
黄公子学安全1 小时前
Java的基础概念(一)
java·开发语言·python
liwulin05061 小时前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr