在JavaScript(NodeJS)中,我尝试使用以下PHP过程制作的HMAC签名来验证有效负载的来源:
$raw_json = '{"link":"https://data.com.sg/resource?2f6b5c55-c8cb-4398-875c-a1c69e0d2706"}';
$payload = json_decode($raw_json, true);
$signature = hash_hmac('sha256', json_encode($payload), 'SECRET_KEY');
使用类似的JS过程:
const rawJSON = '{"link":"https://data.com.sg/resource?2f6b5c55-c8cb-4398-875c-a1c69e0d2706"}';
const payload = JSON.parse(rawJSON)
const signature = HMACSHA256(JSON.stringify(payload), 'SECRET_KEY');
但我发现JSON.stringify(payload)
和json_encode($payload)
的长度不同。记录这两个数据,我发现在使用链接或/
字符(或者任何其他字符)的字符串上执行json_encode时,转义字符会出现问题。
JavaScript的JSON.stringify结果
{"link":"https://data.com.sg/resource?2f6b5c55-c8cb-4398-875c-a1c69e0d2706"}
PHP的json_encode结果
{"link":"https:\/\/data.com.sg\/resource?2f6b5c55-c8cb-4398-875c-a1c69e0d2706"}
我无法在PHP系统端更改进程。所以我必须在nodejs系统端调整HMAC生成过程。
可以做些什么让我可以完美地在JavaScript中重现json_encode
?
请参阅P.S。
P.S。
我已尝试使用某些json_encode模块,但它仍然给我与JSON.stringify
相同的结果。
现在我通过添加替换器talked here来解决它。但由于我的有效载荷将充满格式化文本,我关注的是由于/
字符以外的字符存在导致的另一种结果差异的可能性。或者我应该不关心它?