/** * @class UniCrypto 数据加密服务 * @function init 初始化函数 * @function showConfig 返回配置信息函数 * @function getCrypto 返回原始crypto对象函数 * @function aesEncode AES加密函数 * @function aesDecode AES解密函数 * @function md5 MD5加密函数 */ const crypto = require('crypto') module.exports = class UniCrypto { constructor(config) { this.init(config) } /** * 配置初始化函数 * @param {Object} config */ init(config) { this.config = { //AES加密默认参数 AES: { mod: 'aes-128-cbc', pasword: 'UniStat!010', iv: 'UniStativ', charset: 'utf8', encodeReturnType: 'base64' }, //MD5加密默认参数 MD5: { encodeReturnType: 'hex' }, ...config || {} } return this } /** * 返回配置信息函数 */ showConfig() { return this.config } /** * 返回原始crypto对象函数 */ getCrypto() { return crypto } /** * AES加密函数 * @param {String} data 加密数据明文 * @param {String} encodeReturnType 返回加密数据类型,如:base64 * @param {String} key 密钥 * @param {String} iv 偏移量 * @param {String} mod 模式 * @param {String} charset 编码 */ aesEncode(data, encodeReturnType, key, iv, mod, charset) { const cipher = crypto.createCipheriv(mod || this.config.AES.mod, key || this.config.AES.pasword, iv || this.config.AES.iv) let crypted = cipher.update(data, charset || this.config.AES.charset, 'binary') crypted += cipher.final('binary') crypted = Buffer.from(crypted, 'binary').toString(encodeReturnType || this.config.AES.encodeReturnType) return crypted } /** * AES解密函数 * @param {Object} crypted 加密数据密文 * @param {Object} encodeReturnType 返回加密数据类型,如:base64 * @param {Object} key 密钥 * @param {Object} iv 偏移量 * @param {Object} mod 模式 * @param {Object} charset 编码 */ aesDecode(crypted, encodeReturnType, key, iv, mod, charset) { crypted = Buffer.from(crypted, encodeReturnType || this.config.AES.encodeReturnType).toString('binary') const decipher = crypto.createDecipheriv(mod || this.config.AES.mod, key || this.config.AES.pasword, iv || this.config.AES.iv) let decoded = decipher.update(crypted, 'binary', charset || this.config.AES.charset) decoded += decipher.final(charset || this.config.AES.charset) return decoded } /** * @param {Object} str 加密字符串 * @param {Object} encodeReturnType encodeReturnType 返回加密数据类型,如:hex(转为16进制) */ md5(str, encodeReturnType) { const md5Mod = crypto.createHash('md5') md5Mod.update(str) return md5Mod.digest(encodeReturnType || this.config.MD5.encodeReturnType) } }