sko*_*002 7 sha256 dropbox hmac node.js dropbox-api
我正在尝试使用 Dropbox 的 API,我让它成功地通过 webhooks 向我发送警报,但现在我想在每次他们向我发送警报时验证签名。
从 dropbox 的文档中,他们写道:
“每个通知请求都将包含一个名为 X-Dropbox-Signature 的标头,其中包含请求正文的 HMAC-SHA256 签名,使用您的应用程序机密作为签名密钥。这可以让您的应用程序验证通知确实来自 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);
Run Code Online (Sandbox Code Playgroud)
其中 algorithm 只是“sha256”,secret 是我从 Dropbox 应用程序页面获得的密钥。我必须使用 JSON.stringify(req.body) 因为 req.body 是一个对象,而 hmac.update 需要一个字符串。我想知道这是否是我的错误的来源?
我控制台记录了来自 dropbox 的签名,然后我控制台记录了我使用 hmac 创建的签名,但它是一个不同的签名。
对我可能做错的事情有什么建议吗?
小智 5
格雷格是对的。您需要使用原始正文请求来检查消息的成分。以下代码使用 body-parser 库来提取原始正文。
var bodyParser = require("body-parser");
app.use(bodyParser.json({verify:function(req,res,buf){req.rawBody=buf}}))
Run Code Online (Sandbox Code Playgroud)
然后对于 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")
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6587 次 |
| 最近记录: |