所以,我将有一个服务将字段发布到我的应用程序,并且必须执行以下操作:
当您的帐户中发生操作时,会传递多个值 在Instant Notification查询字符串中(请参阅URL参数)。 在构建字符串时,我们创建了一个sha1或值的哈希值 通过,你的密钥。结果是cverify参数。上 收到查询字符串参数后,您的系统还必须创建一个 sha1,或传递的值的散列,以及您的密钥。
使用cverify评估收到的数据的有效性 我们发送的参数以及系统中产生的值。只有在那里 是两个值之间的完全匹配,你可以肯定 收到的信息未被篡改。
我猜我应该使用crypto
模块。但是,不知道如何做其余的事情。这些参数会通过我知道的req.body
进来......但是,不确定其余部分。
以下是来自python的示例
import hashlib
##
# Verify cverify from an ipn.
# @param post_params: A dictionary of all POST parameters from the notification
# @return: True if the cverify parameter is valid, false otherwise
def ipnVerification(post_params):
secret_key = "YOUR SECRET KEY"
pop = ""
ipn_fields = []
for key in post_params.keys():
if key == "cverify":
continue
ipn_fields.append(key)
ipn_fields.sort()
for field in ipn_fields:
pop += post_params[field] + "|"
pop += secret_key
return post_params["cverify"] == hashlib.sha1(pop).hexdigest()[:8].upper()
这是我到目前为止所做的:
var secretKey = 'My Secret Key';
module.exports = {
validateRequest: function(req){
var params = []
for (param in req.body) {
if (param == "cverify")
continue;
params.push(param);
}
params.sort();
var pop = "";
for (param in params) {
pop += req.body.param + "|";
}
pop += secretKey;
var cverify = req.body.cveryify;
// do crypto stuff
console.log(params);
}
}
答案 0 :(得分:1)
如果我正确理解了代码:
var secretKey = 'My Secret Key';
module.exports = {
validateRequest : function(req) {
/* shorter version of what you have already:
var keys = Object.keys(req.body)
.filter(function(key) { return key !== 'cverify'; })
.sort();
var pop = keys.map(function(key) {
return body[key];
}).join('|') + '|' + secretKey;
*/
...
var sha1 = require('crypto').createHash('sha1');
sha1.update(pop);
var digest = sha1.digest('hex').substring(0, 8).toUpperCase();
return digest === req.body.cverify;
}
};