vue前后端通信进行对所有请求和响应都进行AES加密(密文形式)

一、前言

注:前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最后进行联调整合。无论是开发原生的APP还是webapp还是PC端的软件,只要是前后端分离的模式,就避免不了调用后端提供的接口来进行业务交互。网页或者app,只要抓下包就可以清楚的知道这个请求获取到的数据,这样的接口对爬虫工程师来说是一种福音,要抓你的数据简直轻而易举。
近期因为政府项目要求被要求项目所有的交互与响应都变为密文。如下图实现效果。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210115140916636.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk3OTQzMg==,size_16,color_FFFFFF,t_7二、代码

  • 安装crypto-js。
npm install crypto-js

2.在根目录下的src创建util文件夹、文件夹下aes.js与request.js 。在main.js里面配置引入request.js。

  • aes.js文件为AES加密解密方法,代码如下:
const CryptoJS = require('crypto-js'); //引用AES源码js
const key = CryptoJS.enc.Utf8.parse("xRH8EVswh6WdG5IC"); //设置十六位十六进制数作为密钥 加密
const iv = CryptoJS.enc.Utf8.parse('xRH8EVswh6WdG5IC'); //设置十六位十六进制数作为密钥偏移量 解密
const key1 = CryptoJS.enc.Utf8.parse("LAxl9zHb4kBvzEDa"); //设置十六位十六进制数作为密钥 加密
const iv1 = CryptoJS.enc.Utf8.parse('LAxl9zHb4kBvzEDa'); //设置十六位十六进制数作为密钥偏移量 解密

//为了确保更安全解密、加密各一个密钥
//加密方法
export function Encrypt(word) {
  let srcs = CryptoJS.enc.Utf8.parse(word);
  let encrypted = CryptoJS.AES.encrypt(srcs, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });
  return encrypted.ciphertext.toString().toUpperCase();
  // 如果不需要解密.ciphertext.toString().toUpperCase();将这段代码删除
}
//解密方法
export function Decrypt(word) {
  // let encryptedHexStr = CryptoJS.enc.Hex.parse(word);
  // let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
  let decrypt = CryptoJS.AES.decrypt(word, key1, {
    iv: iv1,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });
  // console.log(decrypt.toString(CryptoJS.enc.Utf8))
  let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
  return decryptedStr.toString();
}

  • request.js为封装的请求、时间戳、增加token(token就是时间戳与后端验证有效无效、后端设置有效期)
import axios from 'axios';//引入axios
import { MessageBox, Message } from 'element-ui';//看自己需求是否引入
import qs from 'qs';
import { Encrypt, Decrypt } from '../util/aes.js';//引入刚才封装的aes加密解密

// timeStamp=3423515
//时间戳
Date.prototype.Format = function (fmt) { // author: meizz
  var o = {
      "M+": this.getMonth() + 1, // 月份
      "d+": this.getDate(), // 日
      "h+": this.getHours(), // 小时
      "m+": this.getMinutes(), // 分
      "s+": this.getSeconds(), // 秒
      "q+": Math.floor((this.getMonth() + 3) / 3), // 季度
      "S": this.getMilliseconds() // 毫秒
  };
  if (/(y+)/.test(fmt))
      fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  for (var k in o)
      if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
          return fmt;
}

// 添加请求拦截器
axios.interceptors.request.use(config => {
   // 在发送请求之前做某事,比如说 增加token
   //默认时间格式
  var time = new Date().Format("yyyy/MM/dd hh:mm:ss");
  var Data = new Date(time).getTime();
  var timeStamp = 'timeStamp='+Data;
  var token = Encrypt(timeStamp).toString();
  //增加请求头token与后端验证(可以不是用时间戳、自己与后端设置验证机制)
  config.headers.token = token;
  return config;
}, error => {
  return Promise.reject(error);
})

// 添加响应拦截器
axios.interceptors.response.use(config => {
	//console.log(config)config是响应所有的请求
    // 判断状态是否是200
  if (config.status === 200) {
 	//如果是200的话、解密数据
    var data = Decrypt(config.data)
    //data是后端返回的数据
    //因为本项目自己用的是response为返回的数据所以坐下处理,如果不需要可以注掉
    var response = {
      data:JSON.parse(data)
    }
     return response;
  } else {
    Promise.reject();
  }
}, error => {
  return Promise.reject(error);
})

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你说的誓言°变失言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值