【问题标题】:HMAC SHA256 Produces Different Result if String vs Variable in Liquid, Shopify如果 Liquid,Shopify 中的字符串与变量,HMAC SHA256 会产生不同的结果
【发布时间】:2018-12-09 19:58:40
【问题描述】:

我正在 Shopify 网站和我的应用程序之间进行一些 URL 验证。在 Shopify 的 .liquid 文件中,我正在使用 Shopify 内置的 hmac_sha256 字符串过滤器创建 HMAC 值。我正在使用存储在客户标签中的密钥和 Twitch 用户 ID。

哈希值作为查询参数传递给我的应用程序,它使用 node.js 中的加密模块生成哈希值并将其与来自 url 的哈希值进行比较。

这里有点奇怪:在 .liquid 文件中,当我直接在字符串过滤器中输入 Twitch ID 时,.liquid 文件生成的哈希值与我的应用生成的值相同,一切看起来都很好:

{{ "12345678" | hmac_sha256: "secret_key" }}

但是,当我将相同的 Twitch ID 作为 变量 传递到字符串过滤器时,液体文件生成的哈希值与第一次不同:

{{ twitchId | hmac_sha256: "secret_key" }}

我已经尝试从 Twitch ID 变量中删除空格和换行符,以防万一。我什至不知道问题可能是什么。也许变量(它是一个字符串)的编码方式与我直接输入时不同?

供参考,检查匹配哈希的javascript代码:

    // Get query string params:
    const { hash, twitchId } = req.query;
    console.log('Twitch ID in query: ' + twitchId);

    // Verify user
    const generatedUserHash = crypto
    .createHmac('sha256', userVerifySecret)
    .update(twitchId)
    .digest('hex');

    console.log('Passed hash: ' + hash + ' Generated hash: ' + generatedUserHash);

    if (generatedUserHash == hash) {
        return true;
    } else {
        return false;
    }

【问题讨论】:

  • 您需要展示如何将 ID 分配给变量。如果没有看到,就无法验证您的问题。

标签: node.js shopify liquid sha256 hmac


【解决方案1】:

您需要展示如何将 ID 分配给变量。没有看到这一点,就无法验证您的问题。

我做了一个快速测试,并证明我得到了带有字符串和变量的相同 HMAC,所以一定是你在分配中做了一些奇怪的事情:

<h1>{{ "12345678"  | hmac_sha256: "secret_key" }}</h1>
{% capture fizz %}12345678{% endcapture%}
<h1>{{ fizz   | hmac_sha256: "secret_key"}}</h1>

生产:

fcfebc0d424982ce8c7a986264beb0d4b1de44507501451e142236404e5b9778 fcfebc0d424982ce8c7a986264beb0d4b1de44507501451e142236404e5b9778

【讨论】:

  • 你在正确的轨道上。在发现我的变量直到我尝试使用 sha256 过滤器之后才被实例化后,我才添加了自己的答案。与我的回答相关的附带问题,您知道是否在我的响应液体文件之前加载了 theme.liquid 文件?如果是这样,为什么我的响应液体文件只能访问 javascript 全局变量而不是液体变量?
【解决方案2】:

原来我的变量 twitchId 在我尝试在 sha256 过滤器中使用它之后被实例化。我在我的 theme.liquid 文件中对其进行了实例化,并且我试图在我的应用程序的一个液体文件中访问它(来自 Shopify 网站的请求是用一个液体文件响应的)。

在我对 Shopify 的回复中,我想我错误地假设 theme.liquid 文件是在文件之前加载的。我假设这是因为我在我的 theme.liquid 文件中实例化的 javascript 变量 在我的响应液体文件中可用(我认为这与在服务器端创建的液体变量和在客户端创建的 javascript 变量有关- 边)。

我现在在我的响应液体文件中实例化twitchId 变量。这样就解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    相关资源
    最近更新 更多