diff --git a/src/utils/cache/storageCache.ts b/src/utils/cache/storageCache.ts index 409e3ee..67dff61 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 fe4e2ad..72629b3 100644 --- a/src/utils/cipher.ts +++ b/src/utils/cipher.ts @@ -1,53 +1,159 @@ -import { decrypt, encrypt } 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() + } + + decrypt(cipherText: string) { + return aesDecrypt(cipherText, this.key, this.getOptions).toString(UTF8) + } +} + +// 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) + } +} + +// 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() } +} + +// 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() - decryptByAES(cipherText: string) { - return decrypt(cipherText, this.key, this.getOptions).toString(UTF8) + return SHA256Hashing.instance + } + + hash(plainText: string) { + return SHA256(plainText).toString() } } -export function encryptByBase64(cipherText: string) { - return UTF8.parse(cipherText).toString(Base64) +// 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 function decodeByBase64(cipherText: string) { - return Base64.parse(cipherText).toString(UTF8) +export class EncryptionFactory { + public static createAesEncryption(params: EncryptionParams): Encryption { + return new AesEncryption(params) + } + + public static createBase64Encryption(): Encryption { + return Base64Encryption.getInstance() + } } -export function encryptByMd5(password: string) { - return md5(password).toString() +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 0000000..fe4e2ad --- /dev/null +++ b/src/utils/cipherOld.ts @@ -0,0 +1,53 @@ +import { decrypt, encrypt } 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() +}