Files
henan-backend/ruoyi-ui/src/utils/aes.js
T
2026-09-21 19:21:35 +08:00

51 lines
1.7 KiB
JavaScript

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)
}