112 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
		
			
		
	
	
			112 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
|  | import CryptoJS from "crypto-js"; | |||
|  | 
 | |||
|  | /** | |||
|  |  * AES加密服务类 | |||
|  |  */ | |||
|  | class AESSecretService { | |||
|  |   constructor() { | |||
|  |     /** | |||
|  |      * 默认配置 | |||
|  |      */ | |||
|  |     this.config = { | |||
|  |       key: "", // 加密密钥
 | |||
|  |       encryptKey: "", // 加密解密密钥
 | |||
|  |       decryptKey: "", // 加密密钥
 | |||
|  |     }; | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |    * 配置AES加密密钥 | |||
|  |    * @param {Object} config - 配置选项 | |||
|  |    * @param {string} [config.key] - 加密解密密钥 | |||
|  |    * @param {string} [config.encryptKey] - 加密密钥 | |||
|  |    * @param {string} [config.decryptKey] - 解密密钥 | |||
|  |    */ | |||
|  |   configure(config) { | |||
|  |     if (!config) throw new Error('配置不能为空'); | |||
|  |     if (!config.key && !config.encryptKey && !config.decryptKey) { | |||
|  |       throw new Error('key、encryptKey、decryptKey 必须传入一个'); | |||
|  |     } | |||
|  | 
 | |||
|  |     this.config = { ...this.config, ...config }; | |||
|  |     if (this.config.key) { | |||
|  |       this.encryptKey = CryptoJS.enc.Utf8.parse(this.config.key); | |||
|  |       this.decryptKey = CryptoJS.enc.Utf8.parse(this.config.key); | |||
|  |     } else { | |||
|  |       this.encryptKey = CryptoJS.enc.Utf8.parse(this.config.encryptKey); | |||
|  |       this.decryptKey = CryptoJS.enc.Utf8.parse(this.config.decryptKey); | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |    * 加密方法 | |||
|  |    * @param {string|Object} word - 要加密的内容 | |||
|  |    * @returns {string} - 加密后的字符串 | |||
|  |    */ | |||
|  |   encrypt(word) { | |||
|  |     let encrypted = ""; | |||
|  |     if (typeof word === "string") { | |||
|  |       const src = CryptoJS.enc.Utf8.parse(word); | |||
|  |       encrypted = CryptoJS.AES.encrypt(src, this.encryptKey, { | |||
|  |         mode: CryptoJS.mode.ECB, | |||
|  |         padding: CryptoJS.pad.Pkcs7, | |||
|  |       }); | |||
|  |     } else if (typeof word === "object") { | |||
|  |       // 对象格式的转成json字符串
 | |||
|  |       const data = JSON.stringify(word); | |||
|  |       const src = CryptoJS.enc.Utf8.parse(data); | |||
|  |       encrypted = CryptoJS.AES.encrypt(src, this.encryptKey, { | |||
|  |         mode: CryptoJS.mode.ECB, | |||
|  |         padding: CryptoJS.pad.Pkcs7, | |||
|  |       }); | |||
|  |     } | |||
|  |     return encrypted.ciphertext.toString(CryptoJS.enc.Base64); | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |    * 解密方法 | |||
|  |    * @param {string} params - 要解密的内容 | |||
|  |    * @returns {string} - 解密后的字符串 | |||
|  |    */ | |||
|  |   decrypt(params) { | |||
|  |     const bytes = CryptoJS.AES.decrypt(params, this.decryptKey, { | |||
|  |       mode: CryptoJS.mode.ECB, | |||
|  |       padding: CryptoJS.pad.Pkcs7 | |||
|  |     }); | |||
|  |     const decryptedText = bytes.toString(CryptoJS.enc.Utf8); | |||
|  |     return JSON.parse(decryptedText); | |||
|  |   } | |||
|  | } | |||
|  | 
 | |||
|  | /** | |||
|  |  * 配置AES加密服务 | |||
|  |  * @param {Object} config - 配置选项 | |||
|  |  * @param {string} [config.key] - 加密解密密钥 | |||
|  |  * @param {string} [config.encryptKey] - 加密密钥 | |||
|  |  * @param {string} [config.decryptKey] - 加密密钥 | |||
|  |  */ | |||
|  | export function configureAesSecret(config) { | |||
|  |   if (!window.aesSecretService) window.aesSecretService = new AESSecretService(); | |||
|  |   return window.aesSecretService.configure(config); | |||
|  | } | |||
|  | 
 | |||
|  | /** | |||
|  |  * 加密方法 | |||
|  |  * @param {string|Object} word - 要加密的内容 | |||
|  |  * @returns {string} - 加密后的字符串 | |||
|  |  */ | |||
|  | export function aesEncrypt(word) { | |||
|  |   if (!window.aesSecretService) throw new Error('未配置AES加密服务,请先调用 configureAesSecret'); | |||
|  |   return window.aesSecretService.encrypt(word); | |||
|  | } | |||
|  | 
 | |||
|  | /** | |||
|  | * 解密方法 | |||
|  | * @param {string} params - 要解密内容 | |||
|  | * @returns {string} - 解密后的字符串 | |||
|  | */ | |||
|  | export function aesDecrypt(params) { | |||
|  |   if (!window.aesSecretService) throw new Error('未配置AES加密服务,请先调用 configureAesSecret'); | |||
|  |   return window.aesSecretService.decrypt(params); | |||
|  | } |