gpt4 book ai didi

node.js - 当使用 unicode 字符时,NodeJS 中的加密会失败

转载 作者:太空宇宙 更新时间:2023-11-03 23:33:56 24 4
gpt4 key购买 nike

我正在尝试使用 NodeJS Crypto 库验证数据完整性。它需要计算 JSON 字符串的 Hmac。

经过一些测试,我已经能够找到问题所在:只要它包含unicode字符,就会发生这种情况。例如:

var hasher = crypto.createHmac("sha256", 'secret_key');
hasher.write('{"timezone":"(GMT-05:00) Eastern Time (US \u0026 Canada)"}');
hasher.end();

var calculatedHmac = new Buffer(hasher.read(), 'utf8').toString('base64');
console.log(calculatedHmac);

但是这会返回错误的 hmac。 PHP 中的相同代码与我从第三方服务收到的签名相匹配:

$data = '{"timezone":"(GMT-05:00) Eastern Time (US \u0026 Canada)"}';

$calculated_hmac = base64_encode(hash_hmac('sha256', $data, 'secret_key', true));
var_dump($calculated_hmac); // Result is correct here

如果我删除 NodeJS 负载中的“\u0026”,那么我会得到与 PHP 中相同的正确结果。

我在这里做错了什么吗?

谢谢!

最佳答案

仅 PHP 从版本 7 ( reference ) 开始支持 \uXXXX 转义序列表示法。

如果您使用的是较旧的 PHP 版本,这些转义序列将按字面意思传递(因此 \u0026 是一个 6 字符的子字符串),而 Node 会将其解释为单个字符(&)。

如果你想让 Node 停止解释转义序列,你需要转义反斜杠:

hasher.write('{"timezone":"(GMT-05:00) Eastern Time (US \\u0026 Canada)"}');

当您这样做时,Node 和 PHP 的结果将是相同的(准确地说,0CE0++Kn9mi5xd7nAz/mWOrr7939RWwzfxhBzxAWtAk=)。

关于node.js - 当使用 unicode 字符时,NodeJS 中的加密会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34924969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com