Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java计算ColdFusion中的HMAC-SHA256摘要_Java_Encryption_Coldfusion_Hmac - Fatal编程技术网

使用Java计算ColdFusion中的HMAC-SHA256摘要

使用Java计算ColdFusion中的HMAC-SHA256摘要,java,encryption,coldfusion,hmac,Java,Encryption,Coldfusion,Hmac,我们正在尝试在ColdFusion中计算HMAC-SHA256摘要,我们正在使用HMAC CFC,但在一个案例中,它为摘要生成的结果与用不同语言生成的结果不同——我们使用Ruby和PHP尝试了相同的数据,并得到了预期的结果。我还尝试了它所基于的CF_HMAC自定义标记,得到了相同的结果 我从CF8encrypt()中了解到它支持HMAC-SHA256,但它仅在Enterprise中可用(我们没有),甚至在开发人员版本中也无法供我测试 所以我的问题是,我可以通过从CF访问Java来做到这一点吗?这

我们正在尝试在ColdFusion中计算HMAC-SHA256摘要,我们正在使用HMAC CFC,但在一个案例中,它为摘要生成的结果与用不同语言生成的结果不同——我们使用Ruby和PHP尝试了相同的数据,并得到了预期的结果。我还尝试了它所基于的CF_HMAC自定义标记,得到了相同的结果

我从CF8
encrypt()
中了解到它支持HMAC-SHA256,但它仅在Enterprise中可用(我们没有),甚至在开发人员版本中也无法供我测试


所以我的问题是,我可以通过从CF访问Java来做到这一点吗?

这就是我最终要做的:

secret = createObject('java', 'javax.crypto.spec.SecretKeySpec' ).Init(my_key.GetBytes(), 'HmacSHA256');
mac = createObject('java', "javax.crypto.Mac");
mac = mac.getInstance("HmacSHA256");
mac.init(secret);
digest = mac.doFinal(my_data.GetBytes());

这将为您提供字节数组,然后您可以将其转换为字符串。

下面是一个使用不同输入/输出格式的DEfusion答案示例。我的密钥是十六进制,数据是较低的ascii(所以UTF-8可以),我需要base64输出,所以我将适当的格式参数传递给BinaryDecode和CharsetDecode:

<cfset keybytes = BinaryDecode(SECRET_KEY, "Hex")>
<cfset databytes = CharsetDecode(data, "UTF-8")>
<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)>
<cfset result = BinaryEncode(digest, "Base64")>

最后一行应该是
digest=mac.doFinal(my_data.GetBytes())getBytes()
时,code>始终提供编码(如“UTF-8”)。否则,它将使用jvm默认值,这可能会产生意外的结果。或者更好的是,使用CF函数生成字节数组。