AES对称和RSA非对称加密登录接口参数

使用RSA非对称加密+AES对称加密

  1. 加密类型

    • RSA:是一种非对称加密算法。它使用一对密钥(公钥和私钥),其中公钥可以公开给任何人,用于加密数据;而私钥需要保密,用于解密数据。
    • AES:是一种对称加密算法。它使用同一个密钥进行加密和解密操作,这意味着在加密和解密过程中,通讯双方必须共享相同的密钥。这种情况下,密钥的安全传输和管理成为了一个关键问题。
  2. 性能与效率

    • RSA:RSA的加密和解密速度较慢,不适用于大量数据的直接加密,更适合加密少量数据,如加密会话密钥或者数字签名等。
    • AES:AES加密速度快,适合加密大量的数据。

由于AES秘钥放在前端不安全,所以采用如下思路

  • 后台生成RSA公钥和私钥,公钥给前端
  • 前端生成AES秘钥,并加密data
  • 前端使用RSA公钥加密AES秘钥,
  • 前端传输给后台加密的data和加密的AES和公钥
  • 后台使用对应RSA私钥解密得到AES秘钥,再用AES秘钥解密data

使用 crypto-js 的AES方式对接口参数进行加密

  • 安装引入
npm install crypto-js
import CryptoJS from 'crypto-js'; //  使用CryptoJS库进行加密
  • 定义加密函数
let key = '5F6B2AK33DASD1235E74C231B47AC8F6' //AES秘钥
// 定义你的加密函数(需要加密的data,AES秘钥)
function encryptData(data,key) {// 这样写的加密后在线工具可以正常解密,但是后台无法解密// return CryptoJS.AES.encrypt(JSON.stringify(data), 'sQPoC/1do9BZMkg8I5c09A==').toString();const _key = CryptoJS.enc.Utf8.parse(key) //将秘钥转换成Utf8字节数组// const iv = CryptoJS.enc.Utf8.parse(key.substr(0, 16))//加密const encrypt = CryptoJS.AES.encrypt(JSON.stringify(data), _key, {// iv: iv,mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7})return encrypt.toString()
}

RSA加解密——jsencrypt库

npm install jsencrypt --save
// 或者cdn引入
<script src="https://cdnjs.cloudflare.com/ajax/libs/jsencrypt/3.2.1/jsencrypt.min.js"></script>
  • 加密方法
// 需要加密的data,RSA公钥
function rsaEncrypt(data,publicKey) {var encryptor = new JSEncrypt();// 假设你已经获取到了后端提供的公钥字符串(key是Base64编码的公钥)encryptor.setPublicKey(publicKey);//使用公钥加密 return encryptor.encrypt(data);
}
  • 解密方法
// 需要加密的data,RSA私钥
function decrypt(data,privateKey) {const encryptor = new JSEncrypt()   encryptor.setPrivateKey(privateKey) // 设置私钥return encryptor.decrypt(data) // 对数据进行解密
}

实际代码逻辑

登录页面路由拦截获取RSA公钥,存储在本地

beforeRouteEnter(to, from, next) {// 假设有个 API 方法 getRsaPulicKey().then(response => { console.log(response.data.publicKey)localStorage.setItem('PublicKey', response.data.publicKey);next();}).catch(error => {// 如果请求失败,可以重定向到错误页面或者其他操作next('/login');});},

在request.js文件进行修改接口参数的修改

  • 定义随机AES私钥
/*** @returns 生成不重复的随机序列号  '60a2cd4faec2474ca6ee43aac3b0bc1d'* 32位  16进制*/
function getUUID() {var d = new Date().getTime();if (window.performance && typeof window.performance.now === "function") {d += performance.now(); //use high-precision timer if available}var uuid = "xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g, function (c) {var r = (d + Math.random() * 16) % 16 | 0;d = Math.floor(d / 16);return (c == "x" ? r : (r & 0x3) | 0x8).toString(16);});return uuid;
}
// 定义AES加密函数 
let AESKey = getUUID()
  • 定义AES加密data函数和RSA加密私钥函数
// AES加密数据data
function aesEncrypt(data) {// 这样写的加密后在线工具可以正常解密,但是后台无法解密// return CryptoJS.AES.encrypt(JSON.stringify(data), 'sQPoC/1do9BZMkg8I5c09A==').toString();const _key = CryptoJS.enc.Utf8.parse(AESKey) //将秘钥转换成Utf8字节数组// const iv = CryptoJS.enc.Utf8.parse(key.substr(0, 16))//加密const encrypt = CryptoJS.AES.encrypt(JSON.stringify(data), _key, {// iv: iv,mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7})return encrypt.toString()
}//定义RSA加密函数,,对AES秘钥加密
function rsaEncrypt(publicKey) {var encryptor = new JSEncrypt();// 假设你已经获取到了后端提供的公钥字符串(key是Base64编码的公钥)encryptor.setPublicKey(publicKey);//使用公钥加密var plaintext = AESKey;return encryptor.encrypt(plaintext);
}
  • request拦截器判断是登录接口修改其data
// request拦截器
service.interceptors.request.use(config => {console.log('request11', config, config.data)if (config.url == "/auth/login") { let PublicKey = ''if (!localStorage.getItem("PublicKey")) {Message({message: '未获取到公钥',type: 'error',})return} else {PublicKey = localStorage.getItem("PublicKey")}config.data = {data: aesEncrypt(config.data), //AES加密后的dataaesKey: rsaEncrypt(PublicKey), //RSA加密后的aes私钥publicKey: PublicKey //RSA公钥};}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/762865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序 转发 功能

mina/pages/food/info.wxml <import src"../../wxParse/wxParse.wxml" /> <view class"container"> <!--商品轮播图--> <view class"swiper-container"><swiper class"swiper_box" autoplay"{{autop…

在vscode中使用git-新手向

Git 应该是必学的版本同步工具&#xff0c;是代码管理的好帮手。 可是对新手来说上手还是有一丢丢门槛&#xff0c;结合 vscode 同步非常方便。 可实现可视化代码变化&#xff0c;提醒自己记录版本修改内容。非常好用。 在 VSCode 中将项目上传至 GitHub 私有仓库基本步骤 确保…

基于ssm电子竞技管理平台的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本电子竞技管理平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

2024上半年软考报名时间及费用汇总!最新!

2024上半年软考考试时间为5月25-28日&#xff0c;2024年上半年软考全国报名平台入口3月18日开通&#xff0c;由此可知各地报名时间将会从3月份陆续开始。各地报名时间不同&#xff0c;且部分地区报名持续时间很短&#xff0c;请大家尽早报名&#xff0c;以免错过。 2024上半年…

java:基于BeanDeserializer实现自定义的Java bean 解析器

JsonDeserializer 关于jackson实现自定义的对象解析器&#xff0c;最常用的方式就是继承顶级抽象类(com.fasterxml.jackson.databind.JsonDeserializer) 来实现,比如下面的代码实现 // 自定义的JavaBean class Person {private String name;private int age;// 标准的getter和…

Prometheus(四):VMware Vsphere监控及数据展示

目录 1 vmware exporter安装配置1.1 vmware exporter介绍1.2 安装 - 使用kubernetes部署1、下载2、修改配置文件3、执行安装4、查看 1.3 安装-使用docker的方式1.4 Prometheus配置1.5 Grafana配置&#xff08;模板页面还需要修改&#xff09; 总结 1 vmware exporter安装配置 …

基于docker commit和Dockerfile为镜像添加ssh服务

系统管理员可以通过SSH服务来远程登录管理服务器 本文介绍基于docker commit和Dockerfile为镜像添加ssh服务 docker commit 该命令支持用户对容器自定义 1.获取镜像ubuntu&#xff1a;18.04&#xff0c;并创建一个容器 [rootnode2 db]docker pull ubuntu:18.04 [rootnode2 …

cloudflare 应用例子几则

Cloudflare&#xff08;以下简称 CF&#xff09; 堪称互联网活菩萨&#xff0c;造就一大批高质量的互联网基础技术服务&#xff0c;更难得的是&#xff0c;几乎所有的服务都有对应的免费的套餐&#xff0c;而且出手大方&#xff0c;基本上有足够的容量或请求次数。 CDN CF 最…

MySQL的基本操作

目录 引言 一、SQL语句简介 &#xff08;一&#xff09;SQL通用语法 &#xff08;二&#xff09;SQL分类 &#xff08;三&#xff09;数据类型 1.数值类型 2.字符串类型 3.日期/时间类型 4.修饰符 二、登录mysql服务 三、SQL语句操作 &#xff08;一&#xff09;DD…

深度学习500问——Chapter04:经典网络解读(1)

文章目录 4.1 LeNet-5 4.1.1 模型介绍 4.1.2 模型结构 4.1.3 模型特性 4.2 AlexNet 4.2.1 模型介绍 4.2.2 模型结构 4.2.3 模型特性 4.3 ZFNet 4.3.1 模型介绍 4.3.2 模型结构 4.3.3 模型特性 4.4 Network in Network 4.4.1 模型介绍 4.4.2 模型结构 4.4.3 模型特性 4.1 LeNet-…

java面试:常见的限流算法有哪些

1 什么是限流算法 限流算法是一种用于限制流量请求的频率或速率的算法&#xff0c;其目的是在高并发或大流量请求的情况下&#xff0c;保护系统服务的安全性和可用性。限流算法可以应对热点业务带来的突发请求、调用方bug导致的突发请求以及恶意攻击请求等情况。是一种系统保护…

金融知识分享系列之:出场信号RSI指标

金融知识分享系列之&#xff1a;出场信号RSI指标 一、出场信号RSI指标二、RSI指标原理三、 指标用法四、RSI指标总结 一、出场信号RSI指标 名称&#xff1a;相对强弱指标参数&#xff1a;(默认14)组成&#xff1a;RSI线以及30轴、50轴、70轴构成 0-30是极弱&#xff1a;0-30的…

jmeter接口自动化测试框架

接口测试可以分为两部分&#xff1a; 一是线上接口&#xff08;生产环境&#xff09;自动化测试&#xff0c;需要自动定时执行&#xff0c;每5分钟自动执行一次&#xff0c;相当于每5分钟就检查一遍线上的接口是否正常&#xff0c;有异常能够及时发现&#xff0c;不至于影响用…

服务器病毒木马通用排查处理应急响应流程

目录 一、勒索病毒发作的特征 二、勒索病毒的应急响应 三、勒索病毒预防与事后加固 一、勒索病毒发作的特征 如果发现大量统一后缀的文件&#xff1b;发现勒索信在Linux/home、/usr等目录&#xff0c;在Windows 桌面或者是被加密文件的文件夹下。如果存在以上特…

四十八岁男子心慌心悸,失眠,喉咙有异物,刘家峰告诉你怎么办!

植物神经功能紊乱&#xff0c;通常简称为植物神经紊乱&#xff0c;是一种涉及自主神经系统的失调疾病。自主神经系统负责控制人体内许多自动功能&#xff0c;如心率、血压、消化和体温调节。植物神经功能紊乱是指由于自主神经系统失衡导致的一系列症状和体征的综合症。 植物神经…

windows DCMTK编译使用(qt) 医学图像

由于项目需要生成DICOM格式的图片&#xff0c;需要使用到第三方开源库DCMTK&#xff0c;于是研究了一番&#xff0c;该库是C编写的&#xff0c;DICOM主要用于医疗体系中&#xff0c;除了可以保存图片信息外&#xff0c;还可以储存患者信息&#xff0c;病例信息&#xff0c;医疗…

【Emgu CV教程】10.2、轮廓之外接矩形、面积计算

文章目录 一、轮廓的外接矩形二、轮廓的面积三、两个函数的简单应用1.原始素材2.代码3.运行结果 一、轮廓的外接矩形 轮廓的外接矩形&#xff0c;函数是&#xff1a; public static Rectangle BoundingRectangle (IInputArray points // 输入的轮廓 )函数返回的是一个矩形&am…

unity3d——沙盒路径

文章目录 Unity3D中不同平台的沙盒路径&#xff1a; 示例 在Unity3D中&#xff0c;尤其是在移动平台如Android和iOS上&#xff0c;由于系统安全机制&#xff0c;应用程序不能直接访问操作系统的所有文件和目录&#xff0c;而是被限制在一个特定的“沙盒”环境中。这个沙盒是一个…

宜搭低代码高级认证实操题1 todolist

进行中待办 已完成待办 待办事项 待办事项远程api和变量配置 回调函数 function didFetch(content) {//console.log(content.data);// content.b = 1; 修改返回数据结构中的 b 字段为1let res = content.data;let todoList = [];for(let i in res){todoList.push(res[i]);}con…

K8S Storage

概述 一般情况下&#xff0c;K8S中的Pod都不应该将数据持久化到Pod中&#xff0c;因为Pod可能被随时创建和删除&#xff08;扩容或缩容&#xff09;&#xff0c;即便是StatefulSet或Operator的Pod&#xff0c;也都不建议在Pod里存放数据&#xff0c;可以将数据持久化到Host上。…