import CryptoJS from 'crypto-js' // AES 密钥和 IV,需与后端 application.yml 中 aes.key / aes.iv 保持一致 const AES_KEY = 'ruoyi@aes@202416' // 16位 const AES_IV = 'ruoyi@aes@iv2024' // 16位 /** * 全局开关:读取环境变量 VUE_APP_USE_AES_ENCRYPT * 安全回退:undefined / 非 'true' 字符串均视为关闭 */ export const AES_ENABLED = process.env.VUE_APP_USE_AES_ENCRYPT === 'true' /** * AES-CBC 加密(PKCS7Padding,输出 Base64 字符串) * @param {string} plainText 明文字符串 * @param {boolean} forceEncrypt 强制加密(忽略全局开关),默认 false * @returns {string} Base64 密文 或 原文(未开启时) */ export function aesEncrypt(plainText, forceEncrypt = false) { if (!AES_ENABLED && !forceEncrypt) { console.log('[AES] 加密已关闭,发送明文') return plainText } const key = CryptoJS.enc.Utf8.parse(AES_KEY) const iv = CryptoJS.enc.Utf8.parse(AES_IV) const encrypted = CryptoJS.AES.encrypt(plainText, key, { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }) const result = encrypted.toString() console.log('[AES] 加密已开启,密文前20位:', result.substring(0, 20) + '...') return result } /** * AES-CBC 解密(PKCS7Padding,输入 Base64 字符串) * @param {string} cipherText Base64 密文 * @returns {string} 明文字符串 */ export function aesDecrypt(cipherText) { const key = CryptoJS.enc.Utf8.parse(AES_KEY) const iv = CryptoJS.enc.Utf8.parse(AES_IV) const decrypted = CryptoJS.AES.decrypt(cipherText, key, { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }) return decrypted.toString(CryptoJS.enc.Utf8) }