Node.js SHA-512摘要的NodeJS Base-64编码

Node.js SHA-512摘要的NodeJS Base-64编码,node.js,cryptojs,Node.js,Cryptojs,我正在使用StarlingBank web钩子来调用我的API。它们声明如下: 使用将签名放置在请求的标头中 X-Hook-Signature,由SHA-512的Base-64编码组成 secret+JSON负载摘要 我最后得到的代码如下。尝试了不同的方法后,我似乎无法获得与页眉中相同的SHA-512 Base-64。我是否正确理解/使用crypto和bodyParser库 // middleware.js const functions = require('firebase-function

我正在使用StarlingBank web钩子来调用我的API。它们声明如下:

使用将签名放置在请求的标头中 X-Hook-Signature,由SHA-512的Base-64编码组成 secret+JSON负载摘要

我最后得到的代码如下。尝试了不同的方法后,我似乎无法获得与页眉中相同的SHA-512 Base-64。我是否正确理解/使用crypto和bodyParser库

// middleware.js
const functions = require('firebase-functions');
import * as crypto from 'crypto';

export const auth = (req, res, next) => {
    let hash = crypto.createHash('sha512');
    hash.update(config.starling.key + req.rawBody));
    req.hasha = hash.digest('base64');

    // req.hasha is different from req.header('X-Hook-Signature')

    next();
}
我的应用程序有以下代码

import * as functions from 'firebase-functions';
import * as express from 'express';
import * as cors from 'cors';
import * as middleware from './middleware';
import bodyParser = require('body-parser');

const app = express();
app.use(cors({ origin: true }));
app.use(bodyParser.json());
app.use(middleware.auth);

// Endpoints removed for brevity

export const hooks = functions.https.onRequest(app);

问题是express和bodyParser会弄乱rawBody

这应该起作用:

const express=require(“express”);
const crypto=require('crypto');
常量app=express();
const bodyParser=require('body-parser');
app.use(bodyParser.json({
验证:(req、res、buf)=>{
req.rawBody=buf
}
}));
app.post('/starling',异步(请求、响应)=>{
const secret='abcd-efgh-12f3-asd34-casd-whatever';
让hash=crypto.createHash('sha512');
hash.update(secret+request.rawBody);
const sigCheck=hash.digest('base64');
const valid=sigCheck==request.headers['x-hook-signature'];
});

问题在于express和bodyParser会弄乱rawBody

这应该起作用:

const express=require(“express”);
const crypto=require('crypto');
常量app=express();
const bodyParser=require('body-parser');
app.use(bodyParser.json({
验证:(req、res、buf)=>{
req.rawBody=buf
}
}));
app.post('/starling',异步(请求、响应)=>{
const secret='abcd-efgh-12f3-asd34-casd-whatever';
让hash=crypto.createHash('sha512');
hash.update(secret+request.rawBody);
const sigCheck=hash.digest('base64');
const valid=sigCheck==request.headers['x-hook-signature'];
});

是否
req.rawBody
始终是相同的内容?否,正文包含触发webhook触发的新插入数据的JSON。那么,您所说的“我似乎无法获得与标头中相同的SHA-512 Base-64”是什么意思?如果
req.rawBody
不同,则您永远不会得到相同的Base64结果是有道理的。如果我理解正确,您正在尝试重新编码您已经知道的数据,只是为了用签名验证它们。解密
X-Hook-Signature
并检查其内部内容如何?这样你就会知道你错过了什么。是的,我错了。。。它不仅仅是
Base64
,而且是用
SHA-512
加密的,所以我的解密观点是无效的。
req.rawBody
总是相同的内容吗?不,body包含触发webhook的新插入数据的JSON。那么,你说的是什么“我似乎无法获得与页眉中相同的SHA-512 Base-64"? 如果
req.rawBody
不同,则您永远不会得到相同的Base64结果是有道理的。如果我理解正确,您正在尝试重新编码您已经知道的数据,只是为了用签名验证它们。解密
X-Hook-Signature
并检查其内部内容如何?这样你就会知道你错过了什么。是的,我错了。。。它不仅是
Base64
,而且是用
SHA-512
加密的,所以我刚才说的解密是无效的。我刚开始测试它,它工作得很好。谢谢@Pieter我制作了一个简单的express中间件来自动验证请求:这肯定会让事情变得更简单!Thankstarling现在已经在他们的GitHub中添加了不同语言的示例,这可能会对将来的人有所帮助:刚刚开始测试它,它工作得非常完美。谢谢@Pieter我制作了一个简单的express中间件来自动验证请求:这肯定会让事情变得更简单!Thankstarling现在已将不同语言的示例添加到他们的GitHub中,这可能会对将来的人有所帮助: