You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现CryptoJS.HmacSHA256无法得到相同结果该如何解决?

问题原因
  • CryptoJS的HmacSHA256(dataToSign, secret)返回的是WordArray对象,和字符串拼接时会自动序列化为小写十六进制字符串
  • 你的Java代码中对HMAC运算结果使用了Base64编码,和JS的十六进制编码规则不符,导致结果不一致
解决方案

把Java代码中Base64编码逻辑替换为十六进制编码即可,参考修改后的完整代码:

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

public class HmacTest {
    public static void main(String[] args) throws Exception {
        String orgId = "abcd";
        String key = "secret";
        String dataToSign = "message";
        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
        sha256_HMAC.init(secret_key);
        // 计算HMAC原始字节结果
        byte[] hmacResult = sha256_HMAC.doFinal(dataToSign.getBytes("UTF-8"));
        // 转小写十六进制字符串,替换原有的Base64编码逻辑
        StringBuilder hexStr = new StringBuilder();
        for (byte b : hmacResult) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexStr.append('0');
            }
            hexStr.append(hex);
        }
        String result2 = orgId + hexStr.toString();
        System.out.println(result2);
    }
}

如果你的项目已经引入了Apache Commons Codec工具包,也可以用工具类简化代码:

// 仅需替换自定义的十六进制转换逻辑即可
String result2 = orgId + org.apache.commons.codec.binary.Hex.encodeHexString(hmacResult, true);

运行修改后的代码即可得到和JS完全一致的输出:abcd8b5f48702995c1598c573db1e21866a9b825d4a794d169d7060a03605796360b

内容的提问来源于stack exchange,提问作者Ajit Kumar Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:15:09