Java转ColdFusion SecretKeySpec HMAC计算结果不准确求助
你的ColdFusion代码和原Java逻辑有三处核心不匹配,导致结果不一致:
- 密钥字节生成逻辑不匹配:Java代码中直接将密钥字符串按UTF-8编码转字节,而你的ColdFusion代码用
BinaryDecode(SECRET_KEY, "Hex")是把密钥当做十六进制字符串解码成字节,除非你的密钥本身是提前转成十六进制存储的,否则这一步逻辑完全不一致。 - 待加密内容的编码不匹配:Java代码中将待加密的msg按ASCII编码转字节,你的ColdFusion代码用
CharsetDecode(data, "UTF-8")用了UTF-8编码,编码规则不同生成的原始字节不一样,最终摘要结果自然不同。 - 最终结果的编码格式不匹配:Java代码循环将摘要字节转成了小写十六进制字符串,你的ColdFusion代码用
BinaryEncode(digest, "Base64")输出的是Base64格式,两种编码输出的内容完全不一样。
修正后对齐Java逻辑的ColdFusion代码
<!--- 对齐Java逻辑:密钥字符串直接转UTF-8字节,若你的密钥确实是十六进制编码可改回原BinaryDecode写法 ---> <cfset keybytes = CharsetDecode(SECRET_KEY, "UTF-8")> <!--- 对齐Java逻辑:待加密内容转ASCII字节 ---> <cfset databytes = CharsetDecode(data, "ASCII")> <cfset secret = createObject("java", "javax.crypto.spec.SecretKeySpec").Init(keybytes,"HmacSHA256")> <cfset mac = createObject("java", "javax.crypto.Mac")> <cfset mac = mac.getInstance("HmacSHA256")> <cfset mac.init(secret)> <cfset digest = mac.doFinal(databytes)> <!--- 对齐Java逻辑:输出小写十六进制字符串 ---> <cfset result = BinaryEncode(digest, "Hex").toLowerCase()>
内容的提问来源于stack exchange,提问作者Jianxee
相关产品推荐
相关产品推荐

