【问题标题】:coldfusion calculating HMAC256 of a getHTTPRequestDataColdfusion 计算 getHTTPRequestData 的 HMAC256
【发布时间】:2014-01-24 12:46:33
【问题描述】:

我目前正在使用 Shopify 并使用他们的 webhook 通知,以便将内容保存到我们的数据库中。

在其 webhook 标头中,它们提供以下标头:X-Shopify-Hmac-Sha256

即:

每个 Webhook 请求都包含一个 X-Shopify-Hmac-SHA256 标头,该标头使用应用的共享密钥(类似于:'267bb1719a8e6ff75c4f2d709be0ca11')以及请求中发送的数据生成。

这真是太棒了;但是,我真的很难计算X-Shopify-Hmac-Sha256 的值。

我有一个.cfm webhook 访问的页面,我通过getHTTPRequestData 传递给这样的函数:

<cfscript>
variables.stArgs                        = {};
variables.stArgs.stWebHookData          = getHTTPRequestData();
application.stObj.stShopify.oShopifyWebHookBusiness.receiveWebHook(argumentCollection=variables.stArgs);
</cfscript>

然后我从 StackOverflow 和 Ben Nadel 那里窃取了一些代码,但似乎都没有最终给我想要的价值。目前我正在使用这样的 Ben Nadels 代码:

local.data = arguments.stWebHookData.toString();
local.macClass = createObject( "java", "javax.crypto.Mac" );
local.secretkeySpec = createObject( "java", "javax.crypto.spec.SecretKeySpec" ).init(toBinary(toBase64(arguments.key)),'HmacSHA256');
local.mac = local.macClass.getInstance('HmacSHA256');
local.mac.init(local.secretkeySpec );

local.hashedBytes = local.mac.doFinal(toBinary(toBase64(local.data)));
return lcase( binaryEncode( local.hashedBytes, "base64" ) );

arguments.key 是共享密钥)

在路上的某个地方,我走错了。我是否完全误解了我应该做的事情。这在 PHP 中看起来很简单。

【问题讨论】:

  • 他们是否提供了您可以匹配的具体示例?您确实需要一个示例来帮助您确定问题是散列代码还是您正在散列的 data。 (通常问题是请求数据..或者它是如何构造的。)
  • 哦,我多么希望他们这样做。它们显示了如何在 PHP 和 ruby​​ 中验证它,但它们没有显示已发送的实际请求。昨晚我试图使用 phpfiddle 从 PHP 进行逆向工程,但无法使用我从 getHTTPRequestData().toString()ToString(getHTTPRequestData().content) 存储的内容使其正常工作,这可能是错误的。
  • toBase64(local.mac.doFinal(getHTTPRequestData().content)) 有效吗?内容可能会被 CF 作为字节数组处理,这正是 doFinal() 所期望的
  • @barnyr 请把它作为答案。你刚刚赢得了我的尊重和钦佩。
  • @Jarede,很高兴它成功了!似乎没有 CF 或 Java 示例,所以希望这对其他人也有用

标签: java coldfusion shopify hmac


【解决方案1】:

所以,getHTTPRequestData() returns a struct with a number of members。我们感兴趣的是内容,它将是一个字节数组。

MAC 类的 doFinal() 方法需要一个字节数组(在我们的例子中是 HTTP 请求的内容)并返回一个字节数组(内容的 HMac)

返回的字节数组需要进行 base-64 编码,以便与 Shopify 放入 webhook 标头的字节数组进行比较。 toBase64() 将为我们做到这一点。

把它们放在一起,你会得到: toBase64(local.mac.doFinal(getHTTPRequestData().content))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    相关资源
    最近更新 更多