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

发布于 2024-07-23 08:32:17 字数 312 浏览 12 评论 0原文

我们正在尝试在 ColdFusion 中计算 HMAC-SHA256 摘要,并且我们正在使用 HMAC CFC,但在一种情况下,与用不同语言生成的摘要相比,它生成的摘要结果不同 - 已使用 Ruby 和 Java 尝试了相同的数据。 PHP并得到预期的结果。 我还尝试了它所基于的 CF_HMAC 自定义标签并得到相同的结果。

据我了解,从 CF8 encrypt() 支持 HMAC-SHA256,但它仅在企业版中可用(我们没有),甚至在开发者版本中不可用供我测试。

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

We are trying to calculate a HMAC-SHA256 digest in ColdFusion and we are using the HMAC CFC, but in one case it is producing a different result for the digest compared to ones generated in different languages - have tried the same data using Ruby & PHP and get the expected result. I have also tried the CF_HMAC custom tag it is based on and get the same results.

I understand that from CF8 encrypt() supports HMAC-SHA256, but it's only available in Enterprise (which we don't have) and isn't even available in developer version for me to test.

So my question is can I do this by accessing Java from CF?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

这就是我最终所做的:

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());

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

This is what I ended up doing:

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());

This gives you the byte array, which you can then convert to a string.

尾戒 2024-07-30 08:32:17

这是 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")>

Here's an example of DEfusion's answer with different input/output formats. My key is hex, my data is lower ascii (so UTF-8 will do), and I need base64 output, so I pass the appropriate format arguments to BinaryDecode and 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")>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文