51 lines
1.7 KiB
JavaScript
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)
|
|
}
|