RSA非对称加密解密,前端公钥加密后端私钥解密
RSA非对称加密解密,前端公钥加密后端私钥解密,可以防止陌生人直接通过后端接口篡改数据。有数据泄露的风险。
前端:Vue框架
后端:sprintboot(Java)
工具类:hutool
前端Vue获取公钥:
这里安装jsencrypt这个库进行RSA的加密
npm i jsencrypt --force
通过后端接口getJSEncryptPublic获取公钥之后,直接套函数加密
/*** 前端vue公钥加密,后段私钥解密* @return*/@GetMapping("/getJSEncryptPublic")public String getJSEncryptPublic(){String str = (String)stringRedisTemplate.opsForValue().get("privateKey");if (StringUtils.isNotBlank(str)){stringRedisTemplate.delete("privateKey");}Map<String, String> mapKeyPair = getMapKeyPair();this.privateKey = mapKeyPair.get("privateKey");stringRedisTemplate.opsForValue().set("privateKey",this.privateKey,15, TimeUnit.MINUTES);this.publicKey = mapKeyPair.get("publicKey");return this.publicKey;}
/*** 获取私钥,公钥* @return*/public static Map<String,String> getMapKeyPair() {
// String privateKey = bytesToBase64(getRsaKey().getPrivate().getEncoded());
// String publicKey = bytesToBase64(getRsaKey().getPublic().getEncoded());// 生成对象,包含钥匙一对RSA rsa = new RSA();// 提取公钥并转成base64编码String publicKeyBase64 = rsa.getPublicKeyBase64();// 提取私钥并转成base64编码String privateKeyBase64 = rsa.getPrivateKeyBase64();Map<String,String> map = new HashMap<>();//privateKey 私钥map.put("privateKey",privateKeyBase64);//publicKey 公钥map.put("publicKey",publicKeyBase64);return map;}
import JSEncrypt from 'jsencrypt/bin/jsencrypt';axios.get('http://localhost:8887/jing/Xqy/user/getJSEncryptPublic').then(reponse =>{console.log("加密加密:",reponse.data);const publicKey = reponse.data // 提取公钥// 获取密码对象const encryptor = new JSEncrypt()// 放入公钥encryptor.setPublicKey(publicKey) // 放入加密的内容,并加密this.passByPublicKey = encryptor.encrypt(this.ruleFormLogin.pass) // 加密后的密文console.log("passByPublicKey:"+this.passByPublicKey) //调用queryzhuce()传密文
之后在以密文的形式传给后端(这里调用登录接口queryzhuce()方法),然后后端利用私钥解密获取到真正的明文。
后端获取密文并解密:
如下此时pass是加密后的密文
@GetMapping("/queryZhuce")public List<CaiwuUser> queryZhuce(@RequestParam(name = "username",required = false)String username,@RequestParam(name = "pass",required = false)String pass,HttpServletRequest request){//解密String decyptByRSAPass = getDecyptByRSA(pass, this.privateKey, this.publicKey);System.out.println("decyptByRSAPass:"+decyptByRSAPass);return xqyService.queryZhuce(username,decyptByRSAPass,request);}
/*** 私钥解密* @param rsaPass* @param privateKey* @return*/public static String getDecyptByRSA(String rsaPass,String privateKey,String publicKeyStr){RSA rsa = new RSA(privateKey, null);String s = rsa.decryptStr(rsaPass, KeyType.PrivateKey, CharsetUtil.CHARSET_UTF_8);//String s = new String(decrypt, CharsetUtil.CHARSET_UTF_8);return s;}
RSA非对称加密公共类
RSAUtil类:
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.crypto.asymmetric.Sign;
import cn.hutool.crypto.asymmetric.SignAlgorithm;
import com.alibaba.fastjson.JSON;
import com.richfit.richfit.dto.AllDataDto;import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;/*** RSA加密解密验签*/
public class RSAUtil {/*** 获取私钥,公钥* @return*/public static Map<String,String> getMapKeyPair() {
// String privateKey = bytesToBase64(getRsaKey().getPrivate().getEncoded());
// String publicKey = bytesToBase64(getRsaKey().getPublic().getEncoded());// 生成对象,包含钥匙一对RSA rsa = new RSA();// 提取公钥并转成base64编码String publicKeyBase64 = rsa.getPublicKeyBase64();// 提取私钥并转成base64编码String privateKeyBase64 = rsa.getPrivateKeyBase64();Map<String,String> map = new HashMap<>();map.put("privateKey",privateKeyBase64);map.put("publicKey",publicKeyBase64);return map;}public static void main(String[] args) {Map<String, String> mapKeyPair = getMapKeyPair();AllDataDto allDataDto = new AllDataDto(null,mapKeyPair.get("privateKey"),mapKeyPair.get("publicKey"),null);System.out.println(JSON.toJSONString(allDataDto));}/*** 私钥解密* @param rsaPass* @param privateKey* @return*/public static String getDecyptByRSA(String rsaPass,String privateKey,String publicKeyStr){RSA rsa = new RSA(privateKey, null);String s = rsa.decryptStr(rsaPass, KeyType.PrivateKey, CharsetUtil.CHARSET_UTF_8);//String s = new String(decrypt, CharsetUtil.CHARSET_UTF_8);return s;}/*** 生成私钥和公钥* @return*/public static KeyPair getRsaKey(){//生成RSA私钥KeyPair pair = SecureUtil.generateKeyPair("RSA");return pair;}/*** 生成私钥* @return*/public static String getRsaPrivateKey(){//生成RSA私钥KeyPair pair = SecureUtil.generateKeyPair("RSA");PrivateKey privateKey = pair.getPrivate();return bytesToBase64(privateKey.getEncoded());}/*** 生成公钥* @return*/public static String getRsaPublicKey(){//生成RSA私钥KeyPair pair = SecureUtil.generateKeyPair("RSA");PrivateKey privateKey = pair.getPrivate();return bytesToBase64(privateKey.getEncoded());}/*** 根据入参生成公钥,私钥,验签* @param text* @return*/public static AllDataDto getAllRsaObject(String text){if (StrUtil.isBlank(text)){throw new RuntimeException("参数不能为空!");}text = text.trim();Map<String,String> map = getMapKeyPair();Sign sign = SecureUtil.sign(SignAlgorithm.SHA256withRSA, map.get("privateKey"), map.get("publicKey"));//签名byte[] data = text.getBytes(StandardCharsets.UTF_8);byte[] signed = sign.sign(data);String signedStr = bytesToBase64(signed);System.out.println("签名:" + signedStr);//验证签名boolean verify = sign.verify(data, base64ToBytes(signedStr));System.out.println("验签:" + verify);AllDataDto allDataDto = new AllDataDto(signedStr, map.get("privateKey"), map.get("publicKey"), text);System.out.println("allDataDto:" + JSON.toJSON(allDataDto));return allDataDto;}// public static void main(String[] args) {
// Map<String, String> map = getMapKeyPair();
// String sign = getSign("123",map.get("privateKey"),map.get("publicKey"));
// System.out.println("签名:"+sign);
// }// public static void main(String[] args) {
// String text = "人最宝贵的是生命.生命对每个人只有一次.人的一生应当这样度过:当他回首往事的时候,不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻.这样,在临死的时候,他能够说:“我已把自己的整个的生命和全部的精力献给了世界上最壮丽的事业---------为人类的解放而斗争.”";
// System.out.println("原文:" + text);
//
// //生成公私钥对
// KeyPair pair = SecureUtil.generateKeyPair("RSA");
// PrivateKey privateKey = pair.getPrivate();
// PublicKey publicKey = pair.getPublic();
// //获得私钥
// String privateKeyStr = bytesToBase64(privateKey.getEncoded());
// System.out.println("私钥:" + privateKeyStr);
// //获得公钥
// String publicKeyStr = bytesToBase64(publicKey.getEncoded());
// System.out.println("公钥:" + publicKeyStr);
//
// RSA rsa = new RSA(privateKeyStr, publicKeyStr);
// System.out.println(rsa);
//
// //公钥加密,私钥解密
// byte[] encrypt = rsa.encrypt(StrUtil.bytes(text, CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey);
// System.out.println("公钥加密:" + bytesToBase64(encrypt));
//
// byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey);
// System.out.println("私钥解密:" + new String(decrypt,StandardCharsets.UTF_8));
////私钥加密,公钥解密byte[] encrypt2 = rsa.encrypt(StrUtil.bytes(text, CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey);System.out.println("私钥加密:" + bytesToBase64(encrypt2));byte[] decrypt2 = rsa.decrypt(encrypt2, KeyType.PublicKey);System.out.println("公钥解密:" + bytesToBase64(decrypt2));
//
// Sign sign = SecureUtil.sign(SignAlgorithm.SHA256withRSA, privateKeyStr, publicKeyStr);
// //签名
// byte[] data = text.getBytes(StandardCharsets.UTF_8);
// byte[] signed = sign.sign(data);
// String signedStr = bytesToBase64(signed);
// System.out.println("签名:" + signedStr);
//
// //验证签名
// boolean verify = sign.verify(data, base64ToBytes(signedStr));
// System.out.println("验签:" + verify);
//
// }/*** 验证签名* @param text 入参* @param signedStr 签名* @param privateKeyStr 私钥* @param publicKeyStr 公钥* @return 签名是否合法*/public static Boolean verifySign(String text,String signedStr,String privateKeyStr,String publicKeyStr){Sign sign = SecureUtil.sign(SignAlgorithm.SHA256withRSA, privateKeyStr, publicKeyStr);//验证签名boolean verify = sign.verify(text.getBytes(StandardCharsets.UTF_8), base64ToBytes(signedStr));System.out.println("验签:" + verify);return verify;}/*** 字节数组转Base64编码** @param bytes 字节数组* @return Base64编码*/private static String bytesToBase64(byte[] bytes) {byte[] encodedBytes = Base64.getEncoder().encode(bytes);return new String(encodedBytes, StandardCharsets.UTF_8);}/*** Base64编码转字节数组** @param base64Str Base64编码* @return 字节数组*/private static byte[] base64ToBytes(String base64Str) {byte[] bytes = base64Str.getBytes(StandardCharsets.UTF_8);return Base64.getDecoder().decode(bytes);}
}
相关文章:
RSA非对称加密解密,前端公钥加密后端私钥解密
RSA非对称加密解密,前端公钥加密后端私钥解密,可以防止陌生人直接通过后端接口篡改数据。有数据泄露的风险。 前端:Vue框架 后端:sprintboot(Java) 工具类:hutool 前端Vue获取公钥:…...
Nginx-01-Nginx 是什么? 能做什么?
nginx 系列 Nginx-01-聊一聊 nginx Nginx-01-Nginx 是什么 Nginx-02-为什么使用 Nginx Nginx-02-Nginx Ubuntu 安装 windows10 WSL ubuntu 安装 nginx 实战笔记 Nginx-02-基本使用 Nginx-03-Nginx 项目架构 Nginx-04-Docker Nginx Nginx-05-nginx 反向代理是什么&…...
最大数字——蓝桥杯十三届2022国赛大学B组真题
问题分析 这道题属于贪心加回溯。所有操作如果能使得高位的数字变大必定优先用在高位,因为对高位的影响永远大于对低位的影响。然后我们再来分析一下,如何使用这两种操作?对于加操作,如果能使这一位的数字加到9则变成9࿰…...
查看微信小程序主包大小
前言 略 查看微信小程序主包大小 在微信开发者工具右上角找到“详情->基本信息” 查看微信小程序主包构成 通过微信开发者工具中的“代码依赖分析”工具查看...
B树与B+树的奥秘:原理解析与性能
引言 B树和B树是计算机科学中两个重要的数据结构,它们在数据库和文件系统中扮演着至关重要的角色。在处理大量数据时,高效的数据组织和检索方式是至关重要的,而B树和B树正是为此而设计的。 B树和B树都是多路查找树的变体,它们通…...
Unity组件入门篇目录
Audio AudioChorusFilter......................................点击导航AudioDistortionFilter..................................点击导航AudioEchoFilter.........................................点击导航AudioHighPassFilter..................................点击导…...
【Python技术】使用akshare、pandas高效复盘每日涨停板行业分析
作为一个程序员宝爸,每天的时间很宝贵,工作之余除了辅导孩子作业,就是补充睡眠。 怎么快速高效的进行当天A股涨停板的复盘,便于第二天的跟踪。这里简单写个示例, 获取当天连涨数排序,以及所属行业排序。 …...
kubeflow文档-介绍与架构
1. kubeflow介绍 Kubeflow项目致力于使机器学习(ML)工作流在Kubernetes上的部署变得简单、可移植和可扩展。目标不是重新创建其他服务,而是提供一种直接的方法,将ML的开源系统部署到不同的基础设施中。无论在哪里运行Kubernetes&a…...
传输层的TCP流量控制比数据链路层作用范围更广
数据链路层的流量控制主要在相邻节点之间进行,它确保在单个链路或网络段上不会发生数据过载。例如,在以太网中,数据链路层使用停止-等待协议或滑动窗口机制来限制发送方发送的数据量,以避免接收方无法处理数据。 而传输层的 TCP 流…...
CSS表格
标准的表格结构 table标签:定义表格 caption标签:定义表格标题,这个标题会居中显示在表格上,一个表格只能定义一个标题 th标签:定义表格的表头,通常成粗体居中表示 tr标签:定义表格的一行 td标…...
东芝移动硬盘数据恢复方法有哪些
谁能懂我此刻的心情啊!移动硬盘用起来真的超级方便,如今我的工作几乎都离不开它,用来存放各种重要文件。可是,让人头疼的事情发生了,昨天我发现移动硬盘里的部分数据竟然莫名其妙地消失了!这可咋整啊&#…...
FullCalendar日历组件集成实战(1)
背景 有一些应用系统或应用功能,如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件,但功能比较简单,用来做数据展现勉强可用。但如果需要进行复杂的数据展示,以及互动操作如通过点击添加事件࿰…...
wps
文章目录 取消自动升级、WPS热点及广告推送excel数字大小排序函数不起作用vlookup函数 取消自动升级、WPS热点及广告推送 打开WPS Office,点击左上角“首页”图标,依次点击右上角“设置”—>“配置和修复工具”。在弹出框点击“高级”,选…...
【软设】常见易错题汇总
目录 计算机系统基础 程序语言基础 数据结构 算法设计与分析 计算机网络与信息安全 软件工程基础 开发方法(结构化与面向对象) 数据库 操作系统 知识产权相关的法律法规 🤯🤯🤯🤯🤯ǹ…...
安全数据交换系统哪个好?该如何选型?
安全数据交换系统是用于在不同网络或组织之间安全、高效地传输和共享数据的解决方案。安全数据交换系统对于任何需要处理敏感数据、确保数据安全、并满足合规要求的组织来说都是至关重要的。 这种系统通常用于以下目的: 1)数据传输:允许用户…...
用matplotlib制作代码和色块
代码如下: # 声明 # -*- coding: utf-8 -*- """ Created on Mon May 13 11:18:59 2024author: sankang """ # 这里调用包 import matplotlib as mpl import matplotlib.pyplot as plt import numpy as npplt.rcParams[axes.unicode_…...
centos无法tab补全至文件
很奇怪的需求:redhat 7.9版本用cd 只能到目录,无法到文件 我个人认为不是个问题,但是甲方需求,你懂的 首先,我们要搞清楚tab补全功能的包bash-completion是否安装,这里肯定是安装了,不过还是看…...
大模型训练框架DeepSpeed使用入门(1): 训练设置
文章目录 一、安装二、训练设置Step1 第一步参数解析Step2 初始化后端Step3 训练初始化 三、训练代码展示 官方文档直接抄过来,留个笔记。 https://deepspeed.readthedocs.io/en/latest/initialize.html 使用案例来自: https://github.com/OvJat/DeepSp…...
自定义类型——结构体、枚举和联合
自定义类型——结构体、枚举和联合 结构体结构体的声明匿名结构体结构体的自引用结构体的初始化结构体的内存对齐修改默认对齐数结构体传参 位段枚举联合 结构体 结构是一些值的集合,这些值被称为成员变量,结构的每个成员可以是不同类型的变量。 数组是…...
Windows11系统安装Mysql8之后,启动服务net start mysql报错“服务没有响应控制功能”的解决办法
问题 系统环境:Windows11 数据库版本:Mysql8 双击安装,一路下一步,完成,很顺利,但是开启服务后 net start mysql 报错: 服务没有响应控制功能。 请键入 NET HELPMSG 2186 以获得更多的帮助 不…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
