文章目录
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
在上述命令中,cvf
是 jar
命令的参数,用于指定不同的操作和选项。以下是每个参数的含义:
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