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
相关产品推荐
相关产品推荐

