uniapp中使用crypto-js 加密数据,后台php解密,简单易用实例


在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; // 取消某次请求
},

image.png


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


评论/留言