const CryptoJS = require('crypto-js'); logger = console.info; class FpCrypt { cookie = ""; publicKey = { publicKey: "", tokenKey: "" }; constructor(cookies, publicKey) { this.cookie = cookies if (publicKey) { this.publicKey = publicKey } } /** * 处理 url 后缀 * @param t url * @param e xhr * @returns {*} */ handleSuffix(t, e) { var a = '1|4|2|0|3'['split']("|"), c = 0, s, l, f, d, p, h; if (!t) return t; if (t['indexOf']('cssSecurity/v1/getPublicKey') > -1) return t; if (t['indexOf']('qlfpcx/v1/queryFpjcxxDc') > -1) return t; s = t; l = this.Re(); // f = l['publicKey']; d = l['tokenKey']; // h = l['urlType']; p = l['urlYzm']; s = this.He(s, d, 0, e) if (p) { var u = (new Date)['valueOf'](); s += '&urls='['concat'](u) } logger(`处理url后缀${t} 完成返回${s}`) return s; } /** * 处理 Param * @param t param * @param e url * @returns {{mesKey: string, enMesKey: string, enVal}} */ handleParam(t, e) { var l = { mesKey: "", enMesKey: "", enVal: t }; if (t != null && t !== '') { l['enVal'] = this.Ye(t, e); } logger(`${t} ,${e} 处理返回${JSON.stringify(l)}`); return l } He(t, e, n, o) { var s = t; if (s["indexOf"]("urlyzm=") > -1) return s; s = this.Ke(s); var l, f = (new Date)['valueOf'](), d = (this.qe()["num"] % 2) === 0 ? (50 * Math['random'](1)) : (49 * Math['random']()) + 51; if ((d >= 0) && (d <= 50)) { logger('对dzfp-ssotoken进行加密') l = this.Qs(f) } else if ((d >= 51) && d <= 100) { logger('对tokenKey进行加密') l = this.Qt(f, e) } var h = s['indexOf']("?") === (s["length"] - 1) ? "" : s['indexOf']("?") > -1 ? "&" : "?", p = s += ""['concat'](h, "ruuid=")['concat'](f); if (o) { logger(`对 ${o} 进行加密`) var v = p['split']("?")['splice'](1); for (var b in v['map'](function (t) { return t["split"]("=")[0] }), o) { if (!v["includes"](""["concat"](b))) { if (('NenAk' !== 'NenAk')) { // _0x2cc2bd("crypto"); } else { var g = b["charAt"](0)['toUpperCase'](); b['length'] > 1 && (g += b['slice'](1)); var m = o[b]; (void 0 !== m) && (p += "&"["concat"](g, "=")["concat"](m)) } } } } var y = ""["concat"](l, "+")["concat"](p), x = this.he(y); return s + ""["concat"](s["indexOf"]("?") ? "&" : "?", "urlyzm=")["concat"](encodeURIComponent(x)) } Re() { return this.publicKey; } Qs(t) { var r = this.qe(), o = r['num'], u = r["tokenVal"], s = (this.a(""['concat'](t)['split'](""))['join']("") + this.a(""['concat'](u)['split'](""))["join"]("")), l = ""; for (var f = 0; (f < s['length']); f += o) { var v = s["substring"](f, (f + o)); l += this.a(v['split'](""))['join']("") } return (((l["substring"](0, 5) + l['substring'](15, 20)) + l['substring'](5, 10)) + l['substring'](20, 25)) }; Qt(t, e) { var r = this.qe(), o = r['num'], s = r['tokenVal'], l = (this.a(""["concat"](t)['split'](""))["join"]("") + this.a(""["concat"](s)['split'](""))["join"]("")), f = ""; for (var d = 0; d < l['length']; d += o) { var h = l['substring'](d, d + o); f += this.a(h['split'](""))['join']("") } var p = "", v = e; if (e) { for (var b = 0; (b < v['length']); b += o) { var g = v["substring"](b, b + o); p += this.a(g["split"](""))["join"]("") } } else { p = 'wk123med876dfesd57m72hnb3yfm98fs'; } p = this.a(""['concat'](p)['split'](""))['join'](""); return (((f['substring'](0, 5) + p['substring'](5, 10)) + f['substring'](15, 20)) + p["substring"](20, 25)) } Ye(t, e) { var o = this.ke(32), a = "".concat(o).concat(t), c = this.Ue("", e); return this.de(a, c) } ke(t, e) { var n, i, a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""), c = []; if (e = e || a.length, t) for (n = 0; n < t; n++) c[n] = a[0 | (Math["random"]() * e)]; else for (c[8] = c[13] = c[18] = c[23] = "-", c[14] = "4", n = 0; (n < 36); n++) c[n] || (i = 0 | (16 * Math["random"]()), c[n] = a[19 === n ? 8 | (3 & i) : i]); logger(`生成随机 ${e} 位字符串`, c["join"]("")) return c["join"]("") } de(t, e) { var o = this.le(e), a = this.le(t); var res = CryptoJS.AES.encrypt(a, o, { mode: CryptoJS.mode.ECB, //ECB模式 padding: CryptoJS.pad.Pkcs7 //padding处理 }).toString(); logger(`AES 加密:${t},${e} 加密所得${res}`) return res; } le(t) { return CryptoJS.enc.Utf8.parse(t) } Ue(t, e) { var c = this.rt(t), u = this.Ke(e); c = "".concat(c, "+").concat(u) return this.he(c) } rt(t) { var n = this.qe(), r = n["num"], i = n["tokenVal"], c = this.a(""["concat"](t)["split"](""))["join"]("") + this.a(""["concat"](i)["split"](""))["join"](""), u = ""; for (var s = 0; (s < c["length"]); s += r) { var l = c["substring"](s, s + r); u += this.a(l["split"](""))["join"]("") } var res = u["substring"](0, 20); logger('倒叙处理字符返回20位', res) return res; } Ke(t) { var s, l, f; if ("" === t || null == t) { return t; } f = t; (0 !== f["indexOf"]("/")) && (f += "/"); s = t["split"]("?"); l = []; (s["length"] > 1) && (f = s[0], l = s[1]["split"]("&")); for (var a = 0; a < l["length"]; a++) { var c = l[a], u = c.split("="); ("t" !== u[0]) && "urlyzm" !== u[0] && "ruuid" !== u[0] && (f += "".concat(f.includes("?") ? "&" : "?").concat(c)) } (-1 === f.indexOf("?")) && (f += "?"); logger(`处理url后缀${t}完成返回${f}`) return f; } // Ke(t) { // var n = "6|5|4|3|0|1|2"["split"]("|"), o = 0; // while (1) { // switch (n[o++]) { // case "0": // (s["length"] > 1) && (f = s[0], l = s[1]["split"]("&")); // continue; // case "1": // for (var a = 0; a < l["length"]; a++) { // var c = l[a], u = c.split("="); // ("t" !== u[0]) && "urlyzm" !== u[0] && "ruuid" !== u[0] && (f += "".concat(f.includes("?") ? "&" : "?").concat(c)) // } // continue; // case "2": // (-1 === f.indexOf("?")) && (f += "?"); // logger(`处理url后缀${t}完成返回${f}`) // return f; // case "3": // var s = t["split"]("?"), l = []; // continue; // case "4": // (0 !== f["indexOf"]("/")) && (f += "/"); // continue; // case "5": // var f = t; // continue; // case "6": // if ("" === t || null == t) { // return t; // } // continue // } // break // } // } he(t) { let res = CryptoJS.MD5(t).toString(); logger(t, '生成32位小写md5 --->', res) return res } qe() { var e = this.Le(), n = this.Ae(e); null === n && (n = ""); var o = n["match"]("[0-9]+"); if ((null === o)) { o = 3; } else { var a = o["index"]; o = parseInt(n["substring"](a, (a + 1)), 10) + 3 } return { num: o, tokenVal: n } } Le() { var e = this.Ae("security-token-key"); if (!e) { var a = this.Ae('lsmhToken'); e = a && ('lsmhToken' === a) ? 'SSOTicket' : 'dzfp-ssotoken' } return e }; Ae(t) { var o, l, s; s = this.cookie; l = JSON["parse"](JSON["stringify"](t)); l += "="; o = s["indexOf"](l); if ((-1 !== o)) { var a = (o + l["length"]), c = s.indexOf(";", a); (-1 === c) && (c = s.length); var u = s.substring(a, c); var res = unescape(u); logger('获取token', t, '16进制解码', res) return res; } return null; }; // Ae(t) { // var n = "4|2|1|3|0"["split"]("|"), i = 0, o, l, s; // while (1) { // switch (n[i++]) { // case "0": // return null; // case "1": // o = s["indexOf"](l); // continue; // case "2": // l += "="; // continue; // case "3": // if ((-1 !== o)) { // var a = (o + l["length"]), c = s.indexOf(";", a); // (-1 === c) && (c = s.length); // var u = s.substring(a, c); // var res = unescape(u); // logger('获取token', t, '16进制解码', res) // return res; // } // continue; // case "4": // // todo: 这里获取 cookie // s = this.cookie; // l = JSON["parse"](JSON["stringify"](t)); // continue // } // break // } // }; a(t) { return t.reverse() }; } module.exports = FpCrypt