UNPKG

rapid-ztx

Version:

Rapid ZTX module

67 lines (57 loc) 1.56 kB
/** * 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, };