如果Shopify中的字符串vs变量,则HMAC SHA256会产生不同的结果

时间:2018-12-09 19:58:41

标签: node.js shopify liquid sha256 hmac

我正在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;
    }

2 个答案:

答案 0 :(得分:1)

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

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

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

产生:

fcfebc0d424982ce8c7a986264beb0d4b1de44507501451e142236404e5b9778 fcfebc0d424982ce8c7a986264beb0d4b1de44507501451e142236404e5b9778

答案 1 :(得分:0)

结果表明,在我试图在sha256过滤器中使用变量twitchId后,实例化了该变量。我在theme.liquid文件中实例化了该文件,并尝试在我的应用程序中以液体文件访问它(Shopify网站的请求以液体文件响应)。

我想我错误地认为theme.liquid文件是在我对Shopify的响应中加载的。我之所以这么认为是因为我在theme.liquid文件中实例化的javascript变量在我的响应Liquid文件中可用(我认为这与在服务器端创建Liquid变量和在客户端创建javascript变量有关。 -侧)。

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