vue3封装AES(CryptoJS)前端加密解密通信代码实现

 更新时间:2023年12月28日 09:10:01   作者:fat_shady  
防止数据被爬取,前后端传参接收参数需要加密处理,使用AES加密,这篇文章主要给大家介绍了关于vue3封装AES(CryptoJS)前端加密解密通信代码实现的相关资料,需要的朋友可以参考下

项目场景:

防止数据被爬取,前后端传参接收参数需要加密处理,使用AES加密。主要使用CryptoJS库中的函数方法,加密:CryptoJS.AES.encrypt(), 解密:CryptoJS.AES.decrypt()。

代码实现

  • 安装CryptoJS库:
npm install crypto-js
  • 创建文件夹,@/utils/secret,引入CryptoJS库并封装加密解密函数方法:
import CryptoJS from 'crypto-js/crypto-js';
const key = CryptoJS.enc.Utf8.parse('123321'); // 密钥 后端提供
const iv = CryptoJS.enc.Utf8.parse(''); // 偏移量
/**
 * AES加密 :字符串 key iv  返回base64
 */
export function Encrypt(word) {
  const srcs = CryptoJS.enc.Utf8.parse(word);
  const encrypted = CryptoJS.AES.encrypt(srcs, key, {
    iv: iv,
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
  });
  return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
}

/**
 * AES 解密 :字符串 key iv  返回base64
 *  */
export function Decrypt(word) {
  const base64 = CryptoJS.enc.Base64.parse(word);
  const src = CryptoJS.enc.Base64.stringify(base64);

  const decrypt = CryptoJS.AES.decrypt(src, key, {
    iv: iv,
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
  });
  return CryptoJS.enc.Utf8.stringify(decrypt);
}
  • 引入加密解密方法,对axios中封装的request 请求前的统一处理做加密:
// 引入
import { Encrypt, Decrypt } from '/@/utils/secret';

this.axiosInstance.interceptors.request.use((config: AxiosRequestConfig) => {
      // If cancel repeat request is turned on, then cancel repeat request is prohibited
      // @ts-ignore
      const { ignoreCancelToken } = config.requestOptions;
      const ignoreCancel =
        ignoreCancelToken !== undefined
          ? ignoreCancelToken
          : this.options.requestOptions?.ignoreCancelToken;

      !ignoreCancel && axiosCanceler.addPending(config);
      if (requestInterceptors && isFunction(requestInterceptors)) {
        config = requestInterceptors(config, this.options);
      }
       // 关键代码:
       // JSON加密,formData不加密(对需要处理的数据格式做判断)
       if (Object.prototype.toString.call(config.data) != '[object FormData]') {
         config.data = { encryptedData: Encrypt(JSON.stringify(config.data)) }; // 加密传参,后端要求的传参:encryptedData:加密参数
       }
      return config;
    }, undefined);
  • response 响应前的统一处理做解密:
this.axiosInstance.interceptors.response.use(async (res: AxiosResponse<any>) => {
	  // 关键代码:
      // 导出时数据格式为blob不解密(对需要处理的数据格式做判断)
      if (Object.prototype.toString.call(res.data) != '[object Blob]') {
        res.data = JSON.parse(Decrypt(res.data)); // 解密返回参数
      }
      const config = res.config;
      if (res.data.code === 401) {
        // 如果未认证,并且未进行刷新令牌,说明可能是访问令牌过期了
        if (!isRefreshToken) {
          isRefreshToken = true;
          // 1. 获取到刷新token
          if (getRefreshToken()) {
            // 2. 进行刷新访问令牌
            try {
              const refreshTokenRes = await this.refreshToken();
              // 2.1 刷新成功,则回放队列的请求 + 当前请求
              setToken('Bearer ' + refreshTokenRes.data.data.accessToken);
              (config as Recordable).headers.Authorization = getToken();
              requestList.forEach((cb: any) => {
                cb();
              });
              requestList = [];
              return new Promise((resolve) => {
                resolve(this.axiosInstance(config));
              });
              // res = await Promise.all([this.axiosInstance(config)])[0]
            } catch (e) {
              requestList.forEach((cb: any) => {
                cb();
              });
            } finally {
              requestList = [];
              isRefreshToken = false;
            }
          }
        } else {
          // 添加到队列,等待刷新获取到新的令牌
          return new Promise((resolve) => {
            requestList.push(() => {
              (config as Recordable).headers.Authorization = getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
              resolve(this.axiosInstance(config));
            });
          });
        }
      }
      res && axiosCanceler.removePending(res.config);
      if (responseInterceptors && isFunction(responseInterceptors)) {
        res = responseInterceptors(res);
      }
      return res;
    }, undefined);

最终效果

加密传参:

后端返回参数加密:

在线加密解密工具:https://www.mklab.cn/utils/aes  或者 http://tools.jb51.net/password/aes_encode

总结

到此这篇关于vue3封装AES(CryptoJS)前端加密解密通信代码实现的文章就介绍到这了,更多相关vue3封装AES加密解密通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue 中如何将函数作为 props 传递给组件的实现代码

    Vue 中如何将函数作为 props 传递给组件的实现代码

    这篇文章主要介绍了Vue 中如何将函数作为 props 传递给组件的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Vue装饰器中的vue-property-decorator 和 vux-class使用详解

    Vue装饰器中的vue-property-decorator 和 vux-class使用详解

    这篇文章主要介绍了Vue装饰器中的vue-property-decorator 和 vux-class使用详解,通过示例代码给大家介绍的非常详细,对vue-property-decorator 和 vux-class的使用感兴趣的朋友一起看看吧
    2022-08-08
  • vue v-on:click传递动态参数的步骤

    vue v-on:click传递动态参数的步骤

    这篇文章主要介绍了vue v-on:click传递动态参数的步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • echarts3如何清空上一次加载的series数据

    echarts3如何清空上一次加载的series数据

    这篇文章主要介绍了echarts3如何清空上一次加载的series数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Vue全家桶实践项目总结(推荐)

    Vue全家桶实践项目总结(推荐)

    本篇文章主要介绍了Vue全家桶实践项目总结(推荐),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • vue如何根据网站路由判断页面主题色详解

    vue如何根据网站路由判断页面主题色详解

    这篇文章主要给大家介绍了关于vue如何根据网站路由判断页面主题色的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • 深入探讨如何在Vue中使用EventBus实现组件间的高效通信

    深入探讨如何在Vue中使用EventBus实现组件间的高效通信

    在现代前端开发中,Vue.js 作为一种流行的渐进式框架,广泛应用于各类 Web 项目的构建中,本文将深入探讨如何在 Vue 中使用 EventBus,实现组件间的高效通信,需要的可以了解下
    2024-11-11
  • vuex 如何动态引入 store modules

    vuex 如何动态引入 store modules

    这篇文章主要介绍了vuex 如何动态引入 store modules,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Vue实现注册页面的用户交互详解

    Vue实现注册页面的用户交互详解

    这篇文章主要为大家详细介绍了Vue实现注册页面的用户交互的相关知识,文中的示例代码讲解详细,对我们深入掌握vue有一定的帮助,需要的小伙伴可以参考下
    2023-12-12
  • vue实现lodop打印功能的示例

    vue实现lodop打印功能的示例

    这篇文章主要介绍了vue实现lodop打印功能的示例,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下
    2020-11-11

最新评论