node.js - 如何在 NodeJS 中比较来自请求正文的 HMAC SHA256 签名

标签 node.js dropbox dropbox-api sha256 hmac

我正在尝试使用 Dropbox 的 API,我成功地通过 webhook 向我发送警报,但现在我想在每次他们向我发送警报时验证签名。

他们从 dropbox 的文档中写道:

“每个通知请求都将包含一个名为 X-Dropbox-Signature 的 header ,其中包含请求正文的 HMAC-SHA256 签名,使用您的应用程序 key 作为签名 key 。这让您的应用程序可以验证通知确实来自 Dropbox。”

所以我成功地捕获了该签名,并且我使用 NodeJS 内置的加密模块尝试使用 HMAC SHA256 创建我自己的签名,然后将我的签名与 Dropbox 发送给我的签名进行比较。

这是我这样做的代码:

  var sign = req.get("X-Dropbox-Signature");
  console.log(sign);
  var hmac = crypto.createHmac(algorithm, secret);
  hmac.update(JSON.stringify(req.body));
  hash = hmac.digest('hex');
  console.log(hash);

其中算法只是“sha256” secret 是我从 Dropbox 应用程序页面获得的 key 。 我必须使用 JSON.stringify(req.body) 因为 req.body 是一个对象而 hmac.update 需要一个字符串。我想知道这是否是我的错误来源?

我控制台记录来自 dropbox 的签名,然后我控制台记录我使用 hmac 创建的签名,但它是不同的签名。

对我可能做错的地方有什么建议吗?

最佳答案

格雷格是对的。您需要使用原始正文请求来检查消息的成分。以下代码使用 body-parser 库来提取原始正文。

var bodyParser = require("body-parser");

app.use(bodyParser.json({verify:function(req,res,buf){req.rawBody=buf}}))

然后是post方法:

app.post('/webhooks', function(req, res) {

    const retrievedSignature = req.get("X-header-Integrity")
    //send this body string for validation with secret
    const bodyString = Buffer.from(req.rawBody, 'utf8')

    let check = integrityCheck(retrievedSignature, bodyString, "secret")

});

关于node.js - 如何在 NodeJS 中比较来自请求正文的 HMAC SHA256 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48843112/

相关文章:

javascript - 你如何在 NW.js 中链接 node.js 的 STDOUT 和 python 的 STDIN

javascript - js如何让一个变量值根据用户登录 Node 存在

node.js - 通过将模型逻辑与模型配置分离来对问题进行后续处理

java - 在 Android 上使用保存的 Dropbox 身份验证详细信息

ios - 当我使用 pod 将 dropbox 与 pod 集成时,出现错误,因为 SFSafariViewController 没有使用 Swift 3 的成员函数

javascript - 如何在 javascript 函数对象中测试是否调用了无效方法?

javascript - chrome 扩展和 dropbox dropin saver 错误

api - 使用 CloudRail 进行 Dropbox 身份验证

java - 使用 Proguard 混淆 Android 应用程序与 Dropbox.com 库

ios - NSInputStream 与 url 在 iOS 中出现 nil