|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- const ksort = require("./ksort.js").ksort;
- const md5 = require("./md5.js").md5;
- const sha1 = require("./sha1.js").sha1;
- const {
- default: SM4Util
- } = require('./sm4');
- const sm3 = require('./SM3.js').sm3;
- const {configObj, isNeedEncry} = require("../config.js");
-
- const _signCode = "etc123456"; //签名码
- const s4 = new SM4Util();
- /**
- * 数字补零函数
- * @param {number} n - 需要补零的数字
- * @param {boolean} isMill - 是否为毫秒
- * @returns {string} 补零后的字符串
- */
- function pad2(n, isMill = false) {
- if (isMill) {
- if (n < 10) {
- return "00" + n
- } else if (n < 100 && n >= 10) {
- return "0" + n
- } else {
- return n
- }
- } else {
- return n < 10 ? "0" + n : n;
- }
- }
-
-
- function sm4Decrypt(bizContent) {
- const decrypted = s4.decryptData_CBC({
- data: {
- bizContent
- }
- }, configObj.sm4Key)
- if (decrypted.data && decrypted.data.bizContent) {
- return JSON.parse(decrypted.data.bizContent)
- }
- }
- /**
- * 获取时间ymdHis格式
- * @returns {string} 时间字符串
- */
- function getDate() {
- var date = new Date();
- return (
- date.getFullYear().toString() +
- pad2(date.getMonth() + 1) +
- pad2(date.getDate()) +
- pad2(date.getHours()) +
- pad2(date.getMinutes()) +
- pad2(date.getSeconds()) +
- pad2(date.getMilliseconds(), true)
- );
- }
-
- /**
- * 获取随机数
- * @param {number} n - 随机数长度
- * @returns {string} 随机数字符串
- */
- function generateMixed(n) {
- var chars = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
- var res = "";
- for (var i = 0; i < n; i++) {
- var id = Math.ceil(Math.random() * 8);
- res += chars[id];
- }
- return res;
- }
-
- /**
- * 签名函数
- * @param {Object} data - 需要签名的数据
- * @param {string} signCode - 签名码
- * @returns {string|boolean} 签名结果或false
- */
- function sign(data, signCode) {
- data = ksort(data);
- var signStr = "";
- var requestId = false;
- for (let k in data) {
- if (k != "sign") {
- if (k == "requestId") {
- requestId = data[k];
- }
- signStr += k + "=" + data[k] + "&";
- }
- }
- signStr += "signCode=" + signCode;
- // console.log("signStr*************"+signStr);
- if (!requestId) {
- return false;
- }
- signStr = md5(signStr);
- signStr = signStr.toUpperCase();
- // console.log('MD5**************' + signStr);
- signStr += requestId;
- // console.log('requestId**************' + signStr);
- signStr = sha1(signStr);
- signStr = signStr.toUpperCase();
- // console.log('SHA1**************' + signStr);
- return signStr;
- }
-
- /**
- * arrayToJsonString array 转json字符串
- * @param {Array} array - 需要转换的数组
- * @returns {string} JSON字符串
- */
- function arrayToJsonString(array) {
- var json = {};
- for (var i in array) {
- if (array[i] instanceof Array) {
- json[i] = {};
- for (var o in array[i]) {
- if (array[i][o] instanceof Array) {
- json[i][o] = {};
- for (var q in array[i][o]) {
- if (array[i][o][q] instanceof Array) {
- json[i][o][q] = {};
- for (var w in array[i][o][q]) {
- json[i][o][q][w] = array[i][o][q][w];
- }
- } else {
- json[i][o][q] = array[i][o][q];
- }
- }
- } else {
- json[i][o] = array[i][o];
- }
- }
- } else {
- json[i] = array[i];
- }
- }
- return JSON.stringify(json);
- }
-
- /**
- * json字符串转换成json对象
- * @param {string} data - JSON字符串
- * @returns {Object} JSON对象
- */
- function stringToJson(data) {
- return JSON.parse(data);
- }
-
- /**
- * array转json对象
- * @param {Array} array - 需要转换的数组
- * @returns {Object} JSON对象
- */
- function arrayToJson(array) {
- return stringToJson(arrayToJsonString(array));
- }
-
- /**
- * 时间格式化
- * @param {Date} date - 日期对象
- * @returns {string} 格式化后的时间字符串
- */
- function formatTime(date) {
- const year = date.getFullYear();
- const month = date.getMonth() + 1;
- const day = date.getDate();
- const hour = date.getHours();
- const minute = date.getMinutes();
- const second = date.getSeconds();
-
- return `${[year, month, day].map(formatNumber).join("-")}T${[
- hour,
- minute,
- second,
- ]
- .map(formatNumber)
- .join(":")}`;;
- }
-
- /**
- * 数字格式化
- * @param {number} n - 需要格式化的数字
- * @returns {string} 格式化后的字符串
- */
- function formatNumber(n) {
- n = n.toString();
- return n[1] ? n : `0${n}`;
- }
-
- /**
- * 获取Token函数(需要根据实际情况实现)
- * @returns {string|null} Token字符串或null
- */
- function getToken() {
- // 这里需要根据实际情况实现获取token的逻辑
- // 暂时返回null
- return null;
- }
-
- /**
- * 调用中台参数加密函数
- * @param {string} ifCode - 接口编码
- * @param {Object} subdata - 需要加密的数据
- * @param {string} type - 类型(可选)
- * @returns {Object} 加密后的数据对象
- */
- function encryption(ifCode, subdata, type) {
- try {
- console.log('开始加密处理,接口编码:', ifCode);
- console.log('原始数据:', subdata);
-
-
- let requestData = new Array();
- requestData["ifCode"] = ifCode;
- requestData["appId"] = configObj.reqEtcAppId; //"52088945";
- requestData["encryptType"] = configObj.reqEncryptType;
-
- // 执行SM4加密
- console.log("sm4Key", configObj.sm4Key)
-
- // 是否需要加密
- if (isNeedEncry()) {
- requestData["bizContent"] = s4.encryptData_CBC(subdata, configObj.sm4Key);
- } else {
- requestData["bizContent"] = JSON.stringify(subdata);
- }
-
- console.log('加密后的bizContent:', requestData["bizContent"]);
-
- requestData["reqId"] = requestData["appId"] + "_" + getDate() + "_" + generateMixed(5);
- requestData["timestamp"] = formatTime(new Date());
-
- // 生产环境
- let token = getToken();
- requestData['signType'] = 'SM3';
- let sm3Data = 'appId=' + requestData['appId'] +
- '&bizContent=' + requestData['bizContent'] +
- '&signType=' + requestData['signType'] +
- '&encryptType=' + requestData["encryptType"] +
- '×tamp=' + requestData['timestamp'] +
- '&ifCode=' + ifCode +
- '&reqId=' + requestData['reqId'];
- if (token) {
- requestData['accessToken'] = token;
- sm3Data += `&accessToken=${token}`;
- }
- console.log("sm3Data原始数据:" + sm3Data)
- console.log("sm3Key:", configObj.sm3Key)
- requestData['sign'] = sm3(sm3Data, configObj.sm3Key);
- console.log("sign:" + requestData['sign'])
- let endData = arrayToJson(requestData);
- console.log('最终加密数据:', endData);
- return endData;
- } catch (error) {
- console.error('加密过程出错:', error);
- throw error;
- }
- }
-
- // CommonJS 导出
- module.exports = {
- arrayToJsonString,
- stringToJson,
- arrayToJson,
- formatTime,
- encryption,
- sm4Decrypt,
- };
|