import express from "express"; import logger from "morgan"; import { AES, enc, mode, pad } from "crypto-js"; const { JSEncrypt } = require("js-encrypt"); interface IReportLog { client: string; webSource?: string; deviceId: string; environment?: string; customInfo: string; logPageNo: number; fileDate: string; logArray: string; } interface ILogItem { l: string; iv?: string; k?: string; v?: number; } interface ILogContent { /**log type */ t: number; /**log content */ c: string; /**js timestamp */ d: string; } const port = '9002'; const privateKey = '-----BEGIN PRIVATE KEY-----\n' + 'MIICXAIBAAKBgG2m5VVtZ4mHml3FB9foDRpDW7PwFoa+1eYN777rNmIdnmezQqHW\n' + 'IRVcnTRVjrgGt2ndP2cYT7MgmWpvr8IjgN0PZ6ngMmKYGpapMqkxsnS/6Q8UZO4P\n' + 'QNlnsK2hSPoIDeJcHxDvo6Nelg+mRHEpD6K+1FIqzvdwVPCcgK7UbZElAgMBAAEC\n' + 'gYAXQM9dgGf2iGU6AXCaXsF4klQ+ImoEhS/DK61t5V+RCwrunttAirJVX2CPGp27\n' + 'dOEseBjb+hHcwMsIAUtadkD7VqDoLg0C63pP6Yr91zoLSq7ru7FL4j8ZDGgHV2tE\n' + '6TbtIRGbxuuF+EmztKqrMCvN4qcxqDvTtU6Xq9Us7xC+uQJBANoFtsuTqDaFFOJ0\n' + 'p0S3+w4lzUcfp+XboVb4+q7wcFumfDCLIuvOTEiCFj5Tj0o2eHtEo3ARHWIcNZqB\n' + 'OgYPPdMCQQCAwJzubpjr7oXxINLERcQ1PXvjD5HD9Q4A20p6pFkcEYTlDYW/nm60\n' + 'PMr7JWG54TH0e6w8IfJZVR2xonVasoInAkEAjdIfuUdgqa5iCnkFgb8IEYjngneG\n' + 'GRCIX/Hv57JB9GxU5qLrYWa92oC8hWiHkifisZTRmAmaCoL9H3cmTmDFvwJAJjwM\n' + '3mmNlBLDR/YdYRfuyni1v5oyCWVOgUad+YmwxLsXIgY//8WGzpN3G9ngCZksgpPv\n' + 'c/QIyiqSpNu/ye1U5QJBAIgSfWXvx+varXagGojcCH8mVtT/E4/w3R+QTLAp6s0L\n' + 'QTQUDPnDGrxvT4sDoU6ib+nn0FAr/kTyJptdlvaXfeo=' + '-----END PRIVATE KEY-----'; const app = express(); app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use('/', (req, res, next) => { const reportLog: IReportLog = req.body; const logArray: Array = reportLog.logArray.split(',').map(it => JSON.parse(decodeURIComponent(it))) as Array; let logContent: Array = logArray.map(it => { let logContent: ILogContent, content: string; if (it.iv && it.k && it.v) { /** * 如果加密过 * 则先使用RSA解密出AES加密的key * 再使用得到的key使用AES解密得到内容 */ /** * if log with encryption * first, use RSA decrypt to get the AES encryption key * then, use the key do AES decrypt can get our log content */ const en = new JSEncrypt(); en.setPrivateKey(privateKey); const key = en.decrypt(it.k).toString(enc.Utf8); content = AES.decrypt(it.l, enc.Utf8.parse(key), { iv: enc.Utf8.parse(it.iv), mode: mode.CTR, padding: pad.NoPadding }).toString(enc.Utf8); } else { content = enc.Base64.parse(it.l).toString(enc.Utf8); } logContent = JSON.parse(content); logContent.c = decodeURIComponent(logContent.c); return logContent; }); res.status(200).json(logContent); }); app.listen(port, () => { console.log(`server run at ${port}`); });