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

Java HmacSHA256函数与在线工具计算结果不一致求助

HmacSHA256计算结果与在线工具不匹配的排查问题

问题描述

我实现了一个Java函数,用于对传入的载荷使用HmacSHA256算法计算哈希值,但函数输出与在线工具计算结果不匹配。

函数代码

public String generateHmacKey (String sftpResponseObj){
        log.warn("SFTP response: (" + sftpResponseObj + ")");
        String encodingType = "HmacSHA256";
        String hash = "";
        try{
            //Get an algorithm 
            Mac sha256Mac = Mac.getInstance(encodingType);
            // Create secret key
            SecretKeySpec secretKeySpec = new SecretKeySpec(this.secretKey.getBytes("UTF-8"), encodingType);
            log.warn("Secret key: (" + secretKeySpec + ")");
            
            //Assign secret key
            sha256Mac.init(secretKeySpec);
            //JSONObject obj = new JSONObject(sftpResponseObj);
            //log.warn("Stringified SFTP response: (" + obj + ")");
            

            // Generate Base64 encoded string
            Base64 base64 = new Base64();
            hash = Base64.encodeBase64String(sha256Mac.doFinal(sftpResponseObj.getBytes("UTF-8")));

            log.warn("Output: (" + hash + ")");

        }catch(NoSuchAlgorithmException e){
            e.printStackTrace();
        }catch(InvalidKeyException e){
            e.printStackTrace();
        }catch(UnsupportedEncodingException e){
            e.printStackTrace();
        }

        return hash;
    }

测试参数

  • 密钥:ZzVhq3sQkjdRsEy
  • 传入的sftpResponseObj内容:
{"id":"ffafb7a3-1701-496f-b5b5-390ad5b7f954","success":"1","comment":"
Warning#: 20965 Msg: WARNING - RR CODE NOT SET UP FOR EXT - SYSTEM HAS CHANGED EXT TO Panel: AP.KU Info: CLIENT ID 6CH4D8    
Account 6CH4D8S opened successfully.
Account 6CH4D8W opened successfully.
","client_id":"6CH4D8"}

结果差异

函数输出:59CqKqY8sXfc1L2lauqh6QYDmp83USyGpbpJgrOQBuo=,与在线工具计算结果不一致。

排查方向与解决方案

1. 字符串的换行符与空格差异

你的sftpResponseObj中comment字段包含换行和空格,不同环境对这些空白字符的处理可能不同:

  • Java代码会严格保留原字符串的所有字符(包括\n、\r或空格)的字节编码
  • 在线工具可能在你粘贴输入时自动去除多余空格、转换换行符格式,导致输入的字节数组和Java中不一致

验证方法:将Java中sftpResponseObj的字节数组转成十六进制字符串,和在线工具输入内容的字节十六进制对比,确认两者是否完全一致。

2. 密钥的编码一致性

确认在线工具使用的密钥编码为UTF-8:

  • 你的代码中密钥是按UTF-8编码转成字节数组,若在线工具默认使用其他编码(比如ISO-8859-1),会导致密钥的字节数组不同,最终哈希结果必然不一致。

3. JSON格式化差异

代码中注释了JSONObject的处理逻辑,若在线工具自动对输入的JSON进行格式化(比如添加缩进、调整空格),而你的代码使用的是原始未格式化的字符串,会导致两者的字节数组不同:

  • 例如在线工具可能将紧凑的JSON转为带缩进的格式,这会改变字符串的字节内容,哈希结果自然不同。

4. Base64编码的实现差异

虽然Java的Base64.encodeBase64String是标准实现,但需确认在线工具的Base64输出规则:

  • 部分工具可能使用URL安全的Base64(替换+为-、/为_),或者省略末尾的=填充字符,这会导致输出字符串外观不同,但实际对应的哈希字节是一致的。

核心验证步骤:

  1. 用Java代码计算HMAC-SHA256的原始字节数组,转成十六进制字符串,和在线工具输出的十六进制结果对比(若工具支持)。
  2. 若十六进制一致,说明是Base64编码规则差异;若不一致,说明输入内容(载荷或密钥)的字节数组存在差异。

内容的提问来源于stack exchange,提问作者RRP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:34:58