Node.js crypto.createHmac失败,字符串类似“quot;面对“url”:&引用;https\/\/"';
我在验证crypto.createHmac与Node.js创建的字符串时遇到问题 我做了一些测试,首先是在PHP中-一切正常,但在Node.js中找不到正确的方法: PHP代码: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
$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计算的