Node.js Nodejs与OpenSSL不同的HMAC签名

Node.js Nodejs与OpenSSL不同的HMAC签名,node.js,openssl,hmac,digest,Node.js,Openssl,Hmac,Digest,我一直在努力在节点中创建正确的HMAC签名 用例 我目前正在为Node开发Jointspace API客户端,以控制飞利浦智能电视。但要让它工作,我需要为配对请求签署一个字符串 现状 我的nodejs代码如下所示: const crypto = require('crypto'); let secret = Buffer.from('ZmVay1EQVFOaZhwQ4Kv81ypLAZNczV9sG4KkseXWn1NEk6cXmPKO/MCa9sryslvLCFMnNe4Z4CPXzToow

我一直在努力在节点中创建正确的HMAC签名

用例 我目前正在为Node开发Jointspace API客户端,以控制飞利浦智能电视。但要让它工作,我需要为配对请求签署一个字符串

现状 我的nodejs代码如下所示:

const crypto = require('crypto');

let secret = Buffer.from('ZmVay1EQVFOaZhwQ4Kv81ypLAZNczV9sG4KkseXWn1NEk6cXmPKO/MCa9sryslvLCFMnNe4Z4CPXzToowvhHvA==', 'base64');
let text = '12345';
let algorithm = 'sha1';
let hmac = crypto.createHmac(algorithm, secret);
hmac.write(text);
hmac.end();

console.log(hmac.read('binary').toString('base64'));
当我运行它时,结果如下:

~ $ node test.js
DURLMkx7YdrIlWdUKo3iNDC3cp0=
预期 当我通过命令行对openssl命令执行完全相同的操作时,我得到了不同的结果。正确的结果

~ $ echo -n "ZmVay1EQVFOaZhwQ4Kv81ypLAZNczV9sG4KkseXWn1NEk6cXmPKO/MCa9sryslvLCFMnNe4Z4CPXzToowvhHvA==" | base64 -d | openssl dgst -sha1 -hmac "12345" -binary | base64
GvbRLlBSY8r/jPqUGox8zZHxOew=
工具书类 有一种方法解决了Node和openssl之间的差异问题。在这个问题上,他们基本上说,节点中的密码只是C++的OpenSSL库的包装。为了让它正常工作,由于转换问题,您需要将机密作为缓冲区而不是字符串提供

例如

但这并不能解决我的问题

产出差异
在您的命令中,您使用12345作为HMAC密钥,但在您的代码中,您使用它作为数据!下面是代码的更新

const crypto = require('crypto');

let secret = 'ZmVay1EQVFOaZhwQ4Kv81ypLAZNczV9sG4KkseXWn1NEk6cXmPKO/MCa9sryslvLCFMnNe4Z4CPXzToowvhHvA=='
let key = '12345';
let algorithm = 'sha1';
let hmac = crypto.createHmac(algorithm, key);
hmac.write(secret);
hmac.end();

console.log(hmac.read('binary').toString('base64'));
这是命令

echo -n "ZmVay1EQVFOaZhwQ4Kv81ypLAZNczV9sG4KkseXWn1NEk6cXmPKO/MCa9sryslvLCFMnNe4Z4CPXzToowvhHvA==" | openssl dgst -sha1 -hmac "12345" -binary | base64
它们都返回相同的散列

const crypto = require('crypto');

let secret = 'ZmVay1EQVFOaZhwQ4Kv81ypLAZNczV9sG4KkseXWn1NEk6cXmPKO/MCa9sryslvLCFMnNe4Z4CPXzToowvhHvA=='
let key = '12345';
let algorithm = 'sha1';
let hmac = crypto.createHmac(algorithm, key);
hmac.write(secret);
hmac.end();

console.log(hmac.read('binary').toString('base64'));
echo -n "ZmVay1EQVFOaZhwQ4Kv81ypLAZNczV9sG4KkseXWn1NEk6cXmPKO/MCa9sryslvLCFMnNe4Z4CPXzToowvhHvA==" | openssl dgst -sha1 -hmac "12345" -binary | base64