Files
ZYZ/shared/pubUtils/sysUtil.ts
2026-03-13 01:38:40 +00:00

122 lines
3.5 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { ENCRYPT_IV, ENCRYPT_KEY } from '../consts';
import { WhiteListModel } from '../db/RegionWhiteList';
const fs = require('fs');
const path = require('path');
import { aesDecrypt, aesEncrypt } from './util';
const crypto = require('crypto');
const isJSON = require('koa-is-json');
const privateKey = fs.readFileSync(path.resolve(__dirname, `../resource/privateKey`));
const publicKey = fs.readFileSync(path.resolve(__dirname, `../resource/publicKey`)); // 发推送加密的秘钥和privateKey不是一对
export async function checkWhiteList(env: string, ip: string, uid: number) {
if (ip) {
let result = await WhiteListModel.checkIp(env, ip);
if (!!result) return true;
}
if (uid) {
let result = await WhiteListModel.checkUid(env, uid);
if (!!result) return true;
}
return false
}
export class MsgEncrypt {
private k: string = ENCRYPT_KEY;
private v: string = ENCRYPT_IV;
private encodeK: string = '';
private encodeV: string = '';
constructor(data: { k?: string, v?: string, encodeK?: string, encodeV?: string, originK?: string, originV?: string }) {
if (data.k && data.v) {
this.encodeAndSetKv(data.k, data.v);
}
if (data.encodeK && data.encodeV) {
this.decodeAndSetKv(data.encodeK, data.encodeV);
}
if (data.originK && data.originV) {
this.k = data.originK;
this.v = data.originV;
}
}
public decryptMsg(data: string) {
if (!data) return false
try {
const decodeStr = aesDecrypt(data, this.k, this.v);
console.log('decoded str:', decodeStr);
let body = JSON.parse(decodeStr);
return body
} catch (e) {
console.error(e);
return false;
}
}
public encryptMsg(json: Object) {
if (!isJSON(json)) return false;
try {
const encodeStr = aesEncrypt(JSON.stringify(json), this.k, this.v);
// console.log('encode str:', encodeStr);
return encodeStr;
} catch (e) {
console.error(e);
return false;
}
}
public decodeAndSetKv(requestK: string, requestV: string) {
if (requestK) {
this.encodeK = requestK;
this.k = this.privateDecrypt(Buffer.from(requestK, 'base64'));
}
if (requestV) {
this.encodeV = requestV;
this.v = this.privateDecrypt(Buffer.from(requestV, 'base64'));
}
return this.getKv();
}
public getKv() {
return { aesKey: this.k, aesIV: this.v }
}
public getEncodeKv() {
return { aesKey: this.encodeK, aesIV: this.encodeV }
}
private privateDecrypt(encryptMsg: Buffer) {
const decryptMsg = crypto.privateDecrypt(
{ key: privateKey, padding: crypto.constants.RSA_PKCS1_PADDING },
encryptMsg
);
return decryptMsg.toString();
}
private getRsaEncodedData(original: string) {
const encryptMsg = crypto.publicEncrypt(
{ key: publicKey, padding: crypto.constants.RSA_PKCS1_PADDING },
Buffer.from(original)
);
return encryptMsg.toString('base64');
}
private encodeAndSetKv(k: string, v: string) {
if (k) {
this.k = k;
this.encodeK = this.getRsaEncodedData(k);
}
if (v) {
this.v = v;
this.encodeV = this.getRsaEncodedData(v);
}
}
}