@@ -19,6 +19,7 @@
|
|||||||
"build": "nest build",
|
"build": "nest build",
|
||||||
"build:webpack": "nest build --webpack --webpackPath ./configs/webpack.config.js -c ./configs/nest-cli.webpack.json",
|
"build:webpack": "nest build --webpack --webpackPath ./configs/webpack.config.js -c ./configs/nest-cli.webpack.json",
|
||||||
"dev": "npm run start",
|
"dev": "npm run start",
|
||||||
|
"dev:encrypt": "npm run start -- --encrypt_enable --encrypt_key=33b9405ac49f63ef4ccbf6b338aeeff8152e844d942ef22278abbec2b1f93b5e",
|
||||||
"repl": "npm run start -- --entryFile repl",
|
"repl": "npm run start -- --entryFile repl",
|
||||||
"bundle": "rimraf out && npm run build && cd dist/src && npx ncc build main.js -o ../../out --minify -s && cd ../.. && chmod +x out/index.js && node scripts/after-bundle.js",
|
"bundle": "rimraf out && npm run build && cd dist/src && npx ncc build main.js -o ../../out --minify -s && cd ../.. && chmod +x out/index.js && node scripts/after-bundle.js",
|
||||||
"start": "cross-env NODE_ENV=development nest start -w --path tsconfig.json -- ",
|
"start": "cross-env NODE_ENV=development nest start -w --path tsconfig.json -- ",
|
||||||
|
|||||||
@@ -55,10 +55,18 @@ export const encryptObject = (target: any) => {
|
|||||||
const keys = Object.keys(target)
|
const keys = Object.keys(target)
|
||||||
for (const key of keys) {
|
for (const key of keys) {
|
||||||
const value = target[key]
|
const value = target[key]
|
||||||
if (isObject(value) && !isArrayLike(value)) {
|
|
||||||
|
// 前置判断 整个 Object 都是被加密的
|
||||||
|
|
||||||
|
if (
|
||||||
|
isObject(value) &&
|
||||||
|
!isArrayLike(value) &&
|
||||||
|
!isEncryptProperty(target, key)
|
||||||
|
) {
|
||||||
target[key] = encryptObject(value)
|
target[key] = encryptObject(value)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
target[key] = encryptProperty(target, key, target[key])
|
target[key] = encryptProperty(target, key, target[key])
|
||||||
}
|
}
|
||||||
return target
|
return target
|
||||||
|
|||||||
@@ -34,10 +34,7 @@ export class EncryptUtil {
|
|||||||
private static key = Buffer.from(mapString(ENCRYPT.key), 'hex')
|
private static key = Buffer.from(mapString(ENCRYPT.key), 'hex')
|
||||||
private static algorithm = ENCRYPT.algorithm || 'aes-256-ecb'
|
private static algorithm = ENCRYPT.algorithm || 'aes-256-ecb'
|
||||||
|
|
||||||
public static encrypt(data: string): string {
|
private static encryptString = (data: string) => {
|
||||||
if (!ENCRYPT.enable) {
|
|
||||||
return data
|
|
||||||
}
|
|
||||||
if (EncryptUtil.isEncryptedString(data)) {
|
if (EncryptUtil.isEncryptedString(data)) {
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
@@ -59,20 +56,70 @@ export class EncryptUtil {
|
|||||||
|
|
||||||
return EncryptUtil.encryptStringPadding + cipherChunks.join('')
|
return EncryptUtil.encryptStringPadding + cipherChunks.join('')
|
||||||
}
|
}
|
||||||
|
public static encrypt<T>(data: T): T {
|
||||||
|
if (!ENCRYPT.enable) {
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (typeof data) {
|
||||||
|
case 'string': {
|
||||||
|
return EncryptUtil.encryptString(data) as T
|
||||||
|
}
|
||||||
|
case 'object': {
|
||||||
|
if (!data) {
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(data)) {
|
||||||
|
return data.map((item) => EncryptUtil.encrypt(item)) as T
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = {} as T
|
||||||
|
|
||||||
|
for (const key in data) {
|
||||||
|
result[key] = EncryptUtil.encrypt(data[key])
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static isEncryptedString(data: string) {
|
public static isEncryptedString(data: string) {
|
||||||
return data.startsWith(EncryptUtil.encryptStringPadding)
|
return data.startsWith(EncryptUtil.encryptStringPadding)
|
||||||
}
|
}
|
||||||
|
|
||||||
public static decrypt(data: string): string {
|
public static decrypt<T>(data: T): T {
|
||||||
if (!ENCRYPT.enable) {
|
if (!ENCRYPT.enable) {
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
return ''
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (typeof data) {
|
||||||
|
case 'string': {
|
||||||
|
return EncryptUtil.decryptString(data) as T
|
||||||
|
}
|
||||||
|
case 'object': {
|
||||||
|
if (Array.isArray(data)) {
|
||||||
|
return data.map((item) => EncryptUtil.decrypt(item)) as T
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = {} as T
|
||||||
|
for (const key in data) {
|
||||||
|
result[key] = EncryptUtil.decrypt(data[key])
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static decryptString(data: string): string {
|
||||||
if (!EncryptUtil.isEncryptedString(data)) {
|
if (!EncryptUtil.isEncryptedString(data)) {
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user