From 6f7d8401289d3c30c0b307fdb579b0f390db8855 Mon Sep 17 00:00:00 2001 From: Kirk Lin Date: Thu, 19 Oct 2023 16:41:29 +0800 Subject: [PATCH] refactor: cipher (#3174) --- src/utils/cache/storageCache.ts | 4 +- src/utils/cipher.ts | 155 ++++++++++++++++++++++++++------ src/utils/cipherOld.ts | 54 +++++++++++ 3 files changed, 186 insertions(+), 27 deletions(-) create mode 100644 src/utils/cipherOld.ts diff --git a/src/utils/cache/storageCache.ts b/src/utils/cache/storageCache.ts index 84ba2aa3f..6e1d4e593 100644 --- a/src/utils/cache/storageCache.ts +++ b/src/utils/cache/storageCache.ts @@ -1,6 +1,6 @@ import { cacheCipher } from '/@/settings/encryptionSetting'; -import type { EncryptionParams } from '/@/utils/cipher'; -import { AesEncryption } from '/@/utils/cipher'; +import type { EncryptionParams } from '/@/utils/cipherOld'; +import { AesEncryption } from '/@/utils/cipherOld'; import { isNullOrUnDef } from '/@/utils/is'; export interface CreateStorageParams extends EncryptionParams { diff --git a/src/utils/cipher.ts b/src/utils/cipher.ts index 7a02cfc35..cbc22422f 100644 --- a/src/utils/cipher.ts +++ b/src/utils/cipher.ts @@ -1,54 +1,159 @@ -import { encrypt, decrypt } from 'crypto-js/aes'; +import { decrypt as aesDecrypt, encrypt as aesEncrypt } from 'crypto-js/aes'; import UTF8, { parse } from 'crypto-js/enc-utf8'; import pkcs7 from 'crypto-js/pad-pkcs7'; -import ECB from 'crypto-js/mode-ecb'; -import md5 from 'crypto-js/md5'; +import CTR from 'crypto-js/mode-ctr'; import Base64 from 'crypto-js/enc-base64'; +import MD5 from 'crypto-js/md5'; +import SHA256 from 'crypto-js/sha256'; +import SHA512 from 'crypto-js/sha512'; + +// Define an interface for encryption +// 定义一个加密器的接口 +export interface Encryption { + encrypt(plainText: string): string; + decrypt(cipherText: string): string; +} +// Define an interface for Hashing +// 定义一个哈希算法的接口 +export interface Hashing { + hash(data: string): string; +} export interface EncryptionParams { key: string; iv: string; } -export class AesEncryption { - private key; - private iv; +class AesEncryption implements Encryption { + private readonly key; + private readonly iv; - constructor(opt: Partial = {}) { - const { key, iv } = opt; - if (key) { - this.key = parse(key); - } - if (iv) { - this.iv = parse(iv); - } + constructor({ key, iv }: EncryptionParams) { + this.key = parse(key); + this.iv = parse(iv); } get getOptions() { return { - mode: ECB, + mode: CTR, padding: pkcs7, iv: this.iv, }; } - encryptByAES(cipherText: string) { - return encrypt(cipherText, this.key, this.getOptions).toString(); + encrypt(plainText: string) { + return aesEncrypt(plainText, this.key, this.getOptions).toString(); } - decryptByAES(cipherText: string) { - return decrypt(cipherText, this.key, this.getOptions).toString(UTF8); + decrypt(cipherText: string) { + return aesDecrypt(cipherText, this.key, this.getOptions).toString(UTF8); } } -export function encryptByBase64(cipherText: string) { - return UTF8.parse(cipherText).toString(Base64); +// Define a singleton class for Base64 encryption +class Base64Encryption implements Encryption { + private static instance: Base64Encryption; + + private constructor() {} + + // Get the singleton instance + // 获取单例实例 + public static getInstance(): Base64Encryption { + if (!Base64Encryption.instance) { + Base64Encryption.instance = new Base64Encryption(); + } + return Base64Encryption.instance; + } + + encrypt(plainText: string) { + return UTF8.parse(plainText).toString(Base64); + } + + decrypt(cipherText: string) { + return Base64.parse(cipherText).toString(UTF8); + } } -export function decodeByBase64(cipherText: string) { - return Base64.parse(cipherText).toString(UTF8); +// Define a singleton class for MD5 Hashing +class MD5Hashing implements Hashing { + private static instance: MD5Hashing; + + private constructor() {} + + // Get the singleton instance + // 获取单例实例 + public static getInstance(): MD5Hashing { + if (!MD5Hashing.instance) { + MD5Hashing.instance = new MD5Hashing(); + } + return MD5Hashing.instance; + } + + hash(plainText: string) { + return MD5(plainText).toString(); + } } -export function encryptByMd5(password: string) { - return md5(password).toString(); +// Define a singleton class for SHA256 Hashing +class SHA256Hashing implements Hashing { + private static instance: SHA256Hashing; + + private constructor() {} + + // Get the singleton instance + // 获取单例实例 + public static getInstance(): SHA256Hashing { + if (!SHA256Hashing.instance) { + SHA256Hashing.instance = new SHA256Hashing(); + } + return SHA256Hashing.instance; + } + + hash(plainText: string) { + return SHA256(plainText).toString(); + } +} + +// Define a singleton class for SHA512 Hashing +class SHA512Hashing implements Hashing { + private static instance: SHA512Hashing; + + private constructor() {} + + // Get the singleton instance + // 获取单例实例 + public static getInstance(): SHA256Hashing { + if (!SHA512Hashing.instance) { + SHA512Hashing.instance = new SHA512Hashing(); + } + return SHA512Hashing.instance; + } + + hash(plainText: string) { + return SHA512(plainText).toString(); + } +} + +export class EncryptionFactory { + public static createAesEncryption(params: EncryptionParams): Encryption { + return new AesEncryption(params); + } + + public static createBase64Encryption(): Encryption { + return Base64Encryption.getInstance(); + } +} + +export class HashingFactory { + public static createMD5Hashing(): Hashing { + return MD5Hashing.getInstance(); + } + + public static createSHA256Hashing(): Hashing { + return SHA256Hashing.getInstance(); + } + + public static createSHA512Hashing(): Hashing { + return SHA512Hashing.getInstance(); + } } diff --git a/src/utils/cipherOld.ts b/src/utils/cipherOld.ts new file mode 100644 index 000000000..7a02cfc35 --- /dev/null +++ b/src/utils/cipherOld.ts @@ -0,0 +1,54 @@ +import { encrypt, decrypt } from 'crypto-js/aes'; +import UTF8, { parse } from 'crypto-js/enc-utf8'; +import pkcs7 from 'crypto-js/pad-pkcs7'; +import ECB from 'crypto-js/mode-ecb'; +import md5 from 'crypto-js/md5'; +import Base64 from 'crypto-js/enc-base64'; + +export interface EncryptionParams { + key: string; + iv: string; +} + +export class AesEncryption { + private key; + private iv; + + constructor(opt: Partial = {}) { + const { key, iv } = opt; + if (key) { + this.key = parse(key); + } + if (iv) { + this.iv = parse(iv); + } + } + + get getOptions() { + return { + mode: ECB, + padding: pkcs7, + iv: this.iv, + }; + } + + encryptByAES(cipherText: string) { + return encrypt(cipherText, this.key, this.getOptions).toString(); + } + + decryptByAES(cipherText: string) { + return decrypt(cipherText, this.key, this.getOptions).toString(UTF8); + } +} + +export function encryptByBase64(cipherText: string) { + return UTF8.parse(cipherText).toString(Base64); +} + +export function decodeByBase64(cipherText: string) { + return Base64.parse(cipherText).toString(UTF8); +} + +export function encryptByMd5(password: string) { + return md5(password).toString(); +}