使用Node.js,Express和Trialpay进行HMAC MD5validation
我试图validation使用Node.js和Express从TrialPay发送的消息。 TrialPay使用HMAC-MD5哈希签名请求,并提供有关validation的说明 。
这是我的代码:
app.post('/trialpay', function(req, res) { var key = "[MY MERCHANT KEY]"; var hash = req.header("TrialPay-HMAC-MD5"); var data = req.body.toString(); var crypted = require("crypto").createHmac("md5", key) .update(data) .digest("hex"); if (hash == crypted) { res.writeHead(200, {"Content-Type": "plain/text"}); res.end("Success!"); } else { throw new Error("Invalid TrialPay Hash"); } });
这显然不起作用(散列不匹配)。
免责声明:我对Node.js非常陌生,并没有什么Javascript的经验,首先。
UPDATE
我没有意识到这个链接是受保护的。
TrialPay使用您的通知密钥(在您的账户信息中设置)作为签署HMAC的密钥。 对于GET请求,问号后面的查询string(在URL中)被签名。 对于POST请求,整个POST正文都被签名。
以下是TrialPay指导您在Google App Engine(Python)中validation的示例:
class MyHandler(webapp.RequestHandler): def post(self): key = '[YOUR MERCHANT KEY]' tphash = self.request.headers['TrialPay-HMAC-MD5'] if hmacmd5(key,self.request.body) != tphash: logging.info('invalid trialpay hash') return
更新2
req.body
打印出来:
{ oid: 'sample-order-id', sid: 'customer-sid', order_date: '04/24/2012', timestamp: '04/24/2012 16:28:46', first_name: 'customer-firstname', last_name: 'customer-lastname', email: 'customer@trialpay.com', revenue: '10.00', zip_code: '94041', country: 'US' }
这应该做的伎俩:
var crypto = require('crypto'); function calculateSignature(key) { return function(req, res, next) { var hash = req.header("TrialPay-HMAC-MD5"), hmac = crypto.createHmac("md5", key); req.on("data", function(data) { hmac.update(data); }); req.on("end", function() { var crypted = hmac.digest("hex"); if(crypted === hash) { // Valid request return res.send("Success!", { "Content-Type": "text/plain" }); } else { // Invalid request return res.send("Invalid TrialPay hash", { "Content-Type": "text/plain" }, 403); } }); req.on("error", function(err) { return next(err); }); } } app.post("/trialpay", calculateSignature("[MY MERCHANT KEY]"));
对于parsing云代码:(我testing过)点是express.bodyParser将parsing用于散列的url编码string。
var parseExpressRawBody = require('parse-express-raw-body'); var queryString = require('querystring'); app.post('/trialpay',parseExpressRawBody(),function(req, res) { var hmac, calculatedSignature,payloadStr=req.body.toString(); hmac = crypto.createHmac('md5', TrialPayMerchentKey); hmac.update(payloadStr); calculatedSignature = hmac.digest('hex'); if (req.headers['trialpay-hmac-md5'] === calculatedSignature) { ~~~~~~
- 如何从hex编码的模数中创buildRSA密钥并在node.js中encryption
- 使用encryption库在NodeJS中创buildPGP兼容签名
- 使用Amazon KMSencryption值,使用带有Lambda的DynamoDB存储/检索(NodeJS)
- 使用Node.js AES点击encryption并使用PyCrypto进行解密
- 是否可以使用node-webkit文件解码AESencryptionvideo?
- 在nodejs中散列string的Websafe编码
- 为BaseJS编码PGPencryption的二进制文件在base64中
- Node.js / SAML:如何解密RequestedSecurityToken的内容
- 如果在encryption之前已知明文的开始处是否存在漏洞?