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(替换
+为-、/为_),或者省略末尾的=填充字符,这会导致输出字符串外观不同,但实际对应的哈希字节是一致的。
核心验证步骤:
- 用Java代码计算HMAC-SHA256的原始字节数组,转成十六进制字符串,和在线工具输出的十六进制结果对比(若工具支持)。
- 若十六进制一致,说明是Base64编码规则差异;若不一致,说明输入内容(载荷或密钥)的字节数组存在差异。
内容的提问来源于stack exchange,提问作者RRP
相关产品推荐
相关产品推荐

