rapid-ztx
Version:
Rapid ZTX module
67 lines (57 loc) • 1.56 kB
JavaScript
/**
* Copyright (c) 2017 Lucky Byte, Inc.
*/
const debug = require('debug')('ztx');
const crypto = require('crypto');
const winston = require('winston');
const rapid_db = require('rapid-db');
/**
* 报文签名
*
* 参数:
* json_pkt: 待签名报文
* sign_key: 签名密钥
* hash_alg: 摘要算法,支持:sha1, md5, sha256
*
* 返回:
* 签名结果
*/
const sign = (json_pkt, sign_key, hash_alg) => {
let input = [];
Object.keys(json_pkt).sort().forEach((key) => {
if (key == 'sign') {
return;
}
if (json_pkt[key].toString().length == 0) {
throw new Error(`待签名报文字段[${key}]的值无效`);
}
input.push(`${key}=${json_pkt[key]}`);
});
input.push(`key=${sign_key}`);
const input_str = input.join('&');
winston.info('待签名字符串:', input_str);
const hasher = crypto.createHash(hash_alg);
return hasher.update(input_str, 'utf8').digest('hex');
}
/**
* 验证报文签名
*
* 参数:
* json_pkt: 待签名报文
* sign_key: 签名密钥
* hash_alg: 摘要算法,支持:sha1, md5, sha256
*
* 返回:
* true: 验证成功,false: 验证失败
*/
const verify = (json_pkt, sign_key, hash_alg) => {
if (!json_pkt.sign) {
throw new Error('待验证签名报文中缺少 sign 字段');
}
const digest = sign(json_pkt, sign_key, hash_alg);
return digest.toLowerCase() == json_pkt.sign.toLowerCase();
}
module.exports = {
sign: sign,
verify: verify,
};