ren-framework
Version:
89 lines (80 loc) • 2.05 kB
JavaScript
const crypto = require('crypto');
const Component = require('../base/Component');
const objectHelper = require('../helpers/object');
/**
* 签名
* @author Verdient。
*/
class Signature extends Component
{
/**
* @inheritdoc
* @author Verdient。
*/
initProperty(){
super.initProperty();
/**
* @property 签名秘钥
* @author Verdient。
*/
this.key = '';
return this;
}
/**
* 准备消息体
* @param {Object} content 消息体
* @return {Object}
* @author Verdient。
*/
prepareContent(content){
objectHelper.ksort(content);
return content;
}
/**
* 计算消息体MD5
* @param {Object} content 消息体
* @return {String}
* @author Verdient。
*/
calculateContentMd5(content){
if(!content || objectHelper.isEmptyObject(content)){
return '';
}
content = this.prepareContent(content);
var md5 = crypto.createHash('md5');
return md5.update(JSON.stringify(content)).digest('hex').toLocaleLowerCase();
}
/**
* 构建签名字符串
* @param {Object} content 消息体
* @return {String}
* @author Verdient。
*/
buildSignatureString(content, signatureMethod, key){
var contentMd5 = this.calculateContentMd5(content);
return (contentMd5 || '') + (signatureMethod || '') + key;
}
/**
* signature(Object content, String signatureMethod)
* 签名
* -------------------------------------------------
* @param {Object} content 消息体
* @param {String} signatureMethod 签名方法
* ---------------------------------------
* @return {String/False}
* @author Verdient。
*/
signature(content, signatureMethod){
try{
var signatureString = this.buildSignatureString(content, signatureMethod, this.key);
var hash = crypto.createHmac(signatureMethod, this.key);
var md5 = crypto.createHash('md5');
let hashString = hash.update(signatureString).digest('hex').toLocaleLowerCase();
return md5.update(hashString).digest('hex').toLocaleLowerCase();
}catch(e){
return false;
}
}
}
module.exports = Signature;