Node.js crypto.createHmac失败,字符串类似“quot;面对“url”:&引用;https\/\/"';

Node.js crypto.createHmac失败,字符串类似“quot;面对“url”:&引用;https\/\/"';,node.js,unicode,cryptography,Node.js,Unicode,Cryptography,我在验证crypto.createHmac与Node.js创建的字符串时遇到问题 我做了一些测试,首先是在PHP中-一切正常,但在Node.js中找不到正确的方法: PHP代码: $jsonData = '"face_url":"https:\/\/"'; echo($jsonData); echo("\n"); $client_secret = 'kqm6FksaIT'; echo hash_hmac("sha256&quo

我在验证crypto.createHmac与Node.js创建的字符串时遇到问题

我做了一些测试,首先是在PHP中-一切正常,但在Node.js中找不到正确的方法:

PHP代码:

$jsonData = '"face_url":"https:\/\/"';
echo($jsonData);
echo("\n");
$client_secret = 'kqm6FksaIT';
echo hash_hmac("sha256", $jsonData, $client_secret);
结果:

"face_url":"https:\/\/"
34a4eb09a639c9b80713158ae89e7e8311586e6e6d76e09967f4e42a24759b3e
对于Node.js,我对字符串的解释有问题:

var crypto = require('crypto');
var str = '"face_url":"https:\/\/"';
console.log(str);
//OK
var buf1 = crypto.createHmac('sha256','kqm6FksaIT').update(str);
var v = buf1.digest('hex');
console.log(v);
//END
结果:

"face_url":"https://"
eb502c4711a6d926eeec7830ff34e021ed62c91e574f383f6534fdd30857a907
=> FAIL.
如您所见,字符串的解释与“face\u url”不同:“https:\/\/”**与**“face\u url”:“https://”**

我已经尝试了很多东西,Buffer.From base64,utf8,JSON.stringify,JSON.parse,但我找不到解决方案

如果您尝试使用另一个字符串,如:
““face\u url”:“https”
,则结果相同

我尝试验证Netatmo POST数据包中接收的密钥,该数据包包含:
“face\u url”:“https:\/\/netatmocameraimage.blob.core

您可以在下面的PHP中找到netatmo webhook的实现:

在PHP代码中,只有转义序列
\\
\'
在单引号表达式中被识别,在所有其他情况下,反斜杠被解释为文字反斜杠,即
\/
被解释为文字反斜杠后跟文字斜杠(请参阅)。这解释了PHP代码的输出:

$jsonData = '"face_url":"https:\/\/"';
...
输出:
“人脸url”:“https:\/\/”
34A4EB09A639C9B80713158AE89E7E8311586E6E6D76E09967F4E42759B3E
在JavaScript中,对于不表示转义序列的字符,将忽略反斜杠,(请参阅),即
\/
相当于文字斜杠。这解释了JavaScript代码的输出:

var str = '"face_url":"https:\/\/"';
...
输出:
“face_url”:“https://”
eb502c4711a6d926eeec7830ff34e021ed62c91e574f383f6534fdd30857a907
因此,为了让JavaScript代码给出与PHP相同的结果,必须屏蔽反斜杠:

var str = '"face_url":"https:\\/\\/"'; 
...
输出:
“人脸url”:“https:\/\/”
34A4EB09A639C9B80713158AE89E7E8311586E6E6D76E09967F4E42759B3E


大概带有
\/
的字符串是PHP with中JSON序列化的结果,默认情况下,它会转义
/
,即将其转换为
\/
,另请参见。在JavaScript中,
/
仅序列化为
//code>。请注意,在PHP中,可以使用禁用
/
转义,另请参见

在PHP代码中,只有转义序列
\\\
\'
在单引号表达式中被识别,在所有其他情况下,反斜杠被解释为文字反斜杠,即
\/
被解释为文字反斜杠后跟文字斜杠(请参阅)。这解释了PHP代码的输出:

$jsonData = '"face_url":"https:\/\/"';
...
输出:
“人脸url”:“https:\/\/”
34A4EB09A639C9B80713158AE89E7E8311586E6E6D76E09967F4E42759B3E
在JavaScript中,对于不表示转义序列的字符,将忽略反斜杠,(请参阅),即
\/
相当于文字斜杠。这解释了JavaScript代码的输出:

var str = '"face_url":"https:\/\/"';
...
输出:
“face_url”:“https://”
eb502c4711a6d926eeec7830ff34e021ed62c91e574f383f6534fdd30857a907
因此,为了让JavaScript代码给出与PHP相同的结果,必须屏蔽反斜杠:

var str = '"face_url":"https:\\/\\/"'; 
...
输出:
“人脸url”:“https:\/\/”
34A4EB09A639C9B80713158AE89E7E8311586E6E6D76E09967F4E42759B3E


大概带有
\/
的字符串是PHP with中JSON序列化的结果,默认情况下,它会转义
/
,即将其转换为
\/
,另请参见。在JavaScript中,
/
仅序列化为
//code>。请注意,在PHP中,可以使用禁用
/
转义,另请参见

反射后,代码之间的唯一区别是request.body的解释

在PHP中,它似乎是纯文本。 Nodejs以JSON格式解析请求

在这个假设之后,我今天早上对NodeJS进行了一些测试,我使用以下选项配置了expres服务器:

var express = require('express');
var crypto = require('crypto');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.text({type:"*/*"}));
之后,字符串将正确显示,并带有以下著名的“/”:

console.log结果: ,“face_url”:https://netatmocameraimage.blob.core.windows.net/production/

瞧!HMAC现在是正确的


NETATMO的HMAC是基于brut文本而不是JSON计算的

反射后,代码之间的唯一区别是request.body的解释

在PHP中,它似乎是纯文本。 Nodejs以JSON格式解析请求

在这个假设之后,我今天早上对NodeJS进行了一些测试,我使用以下选项配置了expres服务器:

var express = require('express');
var crypto = require('crypto');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.text({type:"*/*"}));
之后,字符串将正确显示,并带有以下著名的“/”:

console.log结果: ,“face_url”:https://netatmocameraimage.blob.core.windows.net/production/

瞧!HMAC现在是正确的

NETATMO的HMAC是基于brut文本而不是JSON计算的