在uniapp中引入加密工具
npm install crypto-js --save
写加密和加密方法
// crypto.js
import CryptoJS from 'crypto-js';
import conf from 'const'
const key = conf.key // 此处替换为实际的密钥
export function encrypt(data) {
//console.log('key', key)
// 确保密钥长度为32个字符,以使用AES-256-CBC
if (key.length !== 32) {
throw new Error('密钥长度必须为32个字符');
}
// 生成随机IV,长度为16字节
let iv = CryptoJS.lib.WordArray.random(16);
// 加密数据
const encrypted = CryptoJS.AES.encrypt(JSON.stringify(data), CryptoJS.enc.Utf8.parse(key), {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
//解密测试
//console.log('decode', decrypt(CryptoJS.enc.Base64.stringify(encrypted.ciphertext), CryptoJS.enc.Base64.stringify(iv), key));
// 返回加密数据和IV
return {
encryptedData: CryptoJS.enc.Base64.stringify(encrypted.ciphertext), // 将密文转换为Base64字符串
iv: CryptoJS.enc.Base64.stringify(iv) // 将IV转换为Base64字符串
};
}
export function decrypt(encryptedDataBase64, ivBase64, key) {
// Base64解码加密数据和IV
const encryptedData = CryptoJS.enc.Base64.parse(encryptedDataBase64);
const iv = CryptoJS.enc.Base64.parse(ivBase64);
// 解密数据
const decrypted = CryptoJS.AES.decrypt({
ciphertext: encryptedData
}, CryptoJS.enc.Utf8.parse(key), {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
// 将解密后的数据转换为字符串,然后转换为JSON对象
return JSON.parse(decrypted.toString(CryptoJS.enc.Utf8));
}在需要的地方就可以加密了,比如:
// 请求拦截部分,如配置,每次请求前都会执行
Vue.prototype.$u.http.interceptor.request = (config) => {
//console.log(vm.$u.sys(),'sys')
config.header.platform = vm.$u.sys().platform
config.header.version = vm.$u.sys().appVersion
config.header.versionCode = vm.$u.sys().appVersionCode
config.header.Authorization = 'Bearer ' + (uni.getStorageSync('UserToken') || '');
// 可以对某个url进行特别处理,此url参数为this.$u.get(url)中的url值
if (config.url == 'code2token') config.header.noToken = true;
// 对需要加密的参数进行加密处理
// 对需要加密的参数进行加密处理
//console.log(config.method)
if (config.method === 'POST' || config.method === 'PUT' ) {
// 假设只有POST请求需要加密,并且不是免Token的接口
config.data = encrypt(config.data);
console.log('加密参数', config.data)
}
// 最后需要将config进行return
return config;
// 如果return一个false值,则会取消本次请求
// if(config.url == '/user/rest') return false; // 取消某次请求
},
php后端解密:
// 解密函数
public static function decrypt($data, $key, $iv)
{
$decrypted = openssl_decrypt(base64_decode($data), "AES-256-CBC", $key, OPENSSL_RAW_DATA, base64_decode($iv));
return $decrypted;
}