NodeJS crypto.createHmac SHA256无法正常工作
我目前正在试图实现我们正在使用的库的authentication部分,但是我偶然发现了一个奇怪的数据签名问题,NodeJS中crypto.createHmac的输出大约是hash_hmac的一半在PHP中,这是PHP和NodeJS之间数据的唯一部分(我们需要在这里使用NodeJS)
用于在NodeJS中创build签名的确切代码是,
authorization["oauth_signature"] = crypto.createHmac('SHA256', process.env.SECRET).update(toSign).digest('base64');
而对于PHP来说
$authorization["oauth_signature"] = base64_encode(hash_hmac("SHA256", $signatureString . $signingKey, $secret));
然而,NodeJS版本的输出是
7LkQP+qKR1gSdPq/AgH/3No3ps7EtZXnqwjivMixvM8=
而对于PHP来说
NmQ0MWIzYmJiMjI2YzFlMDhiYzY3NzVmMWY0MzEwNDlhNDU3NDI0ZGJlMzU3NjJhYmMwYjgwYzZjMDE4NDM4OA==
其中有两倍以上的数据
是否必须为NodeJS版本使用不同的库,而不是一个版本? 我们在Microsoft Azure上托pipe我们的NodeJS后端,不知道这是否相关,但似乎至less有效。
编辑:
我发现这个问题,在PHP中的hash_hmac自动导出它的数据为hex数据,crypto.createHmac导出它的数据作为原始的二进制数据,我直接转换成base64,我需要做的是首先导出数据到hex,然后转换那base64。
尝试这个;
var crypto = require('crypto'); var s = 'The quick brown fox jumps over the lazy dog'; console.log( new Buffer( crypto.createHmac('SHA256', 'SECRET').update(s).digest('hex') ).toString('base64') );
DEMO
相当于PHP;
base64_encode(hash_hmac("SHA256",'The quick brown fox jumps over the lazy dog', 'SECRET'))
在提到Azure的情况下,密钥是以Base64格式提供的。 用节点的cryto库,当我作为一个Buffer传入密钥时,我发现它工作。 下面的Azure授权签名头节点代码示例:
const util = require('util'); const crypto = require('crypto'); var accountName = "YOUR_ACCOUNT_NAME"; var key = Buffer("YOUR_BASE64_KEY",'base64'); var hash = crypto.createHmac('sha256',key).update(stringToSign,'utf8').digest('base64'); var signature = util.format("%s:%s", accountName, hash); var authorization = util.format("SharedKey %s", signature);
- Azure Blob存储哈希不匹配(完整性检查失败)
- Azure Node.js Web应用程序 – 如何在更新时提供服务?
- 无法JSONparsing从Node.js应用程序中从Azure服务总线收到的消息
- Cordova Azure – 错误请求 – types错误:无法读取未定义的属性'listRegistrationsByTag'
- 有没有人成功地使用Azure AD对Node.js Web应用程序的用户进行身份validation?
- 微软QnA制造商 – 欢迎消息循环
- 无法连接到数据库 – EADDRNOTAVAIL
- 如何在Azure AD上使用passport.js和OpenID Connect策略
- 使用CSV批量上传到Azure存储