122 lines
3.5 KiB
TypeScript
122 lines
3.5 KiB
TypeScript
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
|