当前位置: 首页 > news >正文

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非对称加密解密&#xff0c;前端公钥加密后端私钥解密&#xff0c;可以防止陌生人直接通过后端接口篡改数据。有数据泄露的风险。 前端&#xff1a;Vue框架 后端&#xff1a;sprintboot&#xff08;Java&#xff09; 工具类&#xff1a;hutool 前端Vue获取公钥&#xff1a…...

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组真题

问题分析 这道题属于贪心加回溯。所有操作如果能使得高位的数字变大必定优先用在高位&#xff0c;因为对高位的影响永远大于对低位的影响。然后我们再来分析一下&#xff0c;如何使用这两种操作&#xff1f;对于加操作&#xff0c;如果能使这一位的数字加到9则变成9&#xff0…...

查看微信小程序主包大小

前言 略 查看微信小程序主包大小 在微信开发者工具右上角找到“详情->基本信息” 查看微信小程序主包构成 通过微信开发者工具中的“代码依赖分析”工具查看...

B树与B+树的奥秘:原理解析与性能

引言 B树和B树是计算机科学中两个重要的数据结构&#xff0c;它们在数据库和文件系统中扮演着至关重要的角色。在处理大量数据时&#xff0c;高效的数据组织和检索方式是至关重要的&#xff0c;而B树和B树正是为此而设计的。 B树和B树都是多路查找树的变体&#xff0c;它们通…...

Unity组件入门篇目录

Audio AudioChorusFilter......................................点击导航AudioDistortionFilter..................................点击导航AudioEchoFilter.........................................点击导航AudioHighPassFilter..................................点击导…...

【Python技术】使用akshare、pandas高效复盘每日涨停板行业分析

作为一个程序员宝爸&#xff0c;每天的时间很宝贵&#xff0c;工作之余除了辅导孩子作业&#xff0c;就是补充睡眠。 怎么快速高效的进行当天A股涨停板的复盘&#xff0c;便于第二天的跟踪。这里简单写个示例&#xff0c; 获取当天连涨数排序&#xff0c;以及所属行业排序。 …...

kubeflow文档-介绍与架构

1. kubeflow介绍 Kubeflow项目致力于使机器学习&#xff08;ML&#xff09;工作流在Kubernetes上的部署变得简单、可移植和可扩展。目标不是重新创建其他服务&#xff0c;而是提供一种直接的方法&#xff0c;将ML的开源系统部署到不同的基础设施中。无论在哪里运行Kubernetes&a…...

传输层的TCP流量控制比数据链路层作用范围更广

数据链路层的流量控制主要在相邻节点之间进行&#xff0c;它确保在单个链路或网络段上不会发生数据过载。例如&#xff0c;在以太网中&#xff0c;数据链路层使用停止-等待协议或滑动窗口机制来限制发送方发送的数据量&#xff0c;以避免接收方无法处理数据。 而传输层的 TCP 流…...

CSS表格

标准的表格结构 table标签&#xff1a;定义表格 caption标签&#xff1a;定义表格标题&#xff0c;这个标题会居中显示在表格上&#xff0c;一个表格只能定义一个标题 th标签&#xff1a;定义表格的表头&#xff0c;通常成粗体居中表示 tr标签&#xff1a;定义表格的一行 td标…...

东芝移动硬盘数据恢复方法有哪些

谁能懂我此刻的心情啊&#xff01;移动硬盘用起来真的超级方便&#xff0c;如今我的工作几乎都离不开它&#xff0c;用来存放各种重要文件。可是&#xff0c;让人头疼的事情发生了&#xff0c;昨天我发现移动硬盘里的部分数据竟然莫名其妙地消失了&#xff01;这可咋整啊&#…...

FullCalendar日历组件集成实战(1)

背景 有一些应用系统或应用功能&#xff0c;如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件&#xff0c;但功能比较简单&#xff0c;用来做数据展现勉强可用。但如果需要进行复杂的数据展示&#xff0c;以及互动操作如通过点击添加事件&#xff0…...

wps

文章目录 取消自动升级、WPS热点及广告推送excel数字大小排序函数不起作用vlookup函数 取消自动升级、WPS热点及广告推送 打开WPS Office&#xff0c;点击左上角“首页”图标&#xff0c;依次点击右上角“设置”—>“配置和修复工具”。在弹出框点击“高级”&#xff0c;选…...

【软设】常见易错题汇总

目录 计算机系统基础 程序语言基础 数据结构 算法设计与分析 计算机网络与信息安全 软件工程基础 开发方法&#xff08;结构化与面向对象&#xff09; 数据库 操作系统 知识产权相关的法律法规 &#x1f92f;&#x1f92f;&#x1f92f;&#x1f92f;&#x1f92f;&#x1f9…...

安全数据交换系统哪个好?该如何选型?

安全数据交换系统是用于在不同网络或组织之间安全、高效地传输和共享数据的解决方案。安全数据交换系统对于任何需要处理敏感数据、确保数据安全、并满足合规要求的组织来说都是至关重要的。 这种系统通常用于以下目的&#xff1a; 1&#xff09;数据传输&#xff1a;允许用户…...

用matplotlib制作代码和色块

代码如下&#xff1a; # 声明 # -*- 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补全至文件

很奇怪的需求&#xff1a;redhat 7.9版本用cd 只能到目录&#xff0c;无法到文件 我个人认为不是个问题&#xff0c;但是甲方需求&#xff0c;你懂的 首先&#xff0c;我们要搞清楚tab补全功能的包bash-completion是否安装&#xff0c;这里肯定是安装了&#xff0c;不过还是看…...

大模型训练框架DeepSpeed使用入门(1): 训练设置

文章目录 一、安装二、训练设置Step1 第一步参数解析Step2 初始化后端Step3 训练初始化 三、训练代码展示 官方文档直接抄过来&#xff0c;留个笔记。 https://deepspeed.readthedocs.io/en/latest/initialize.html 使用案例来自&#xff1a; https://github.com/OvJat/DeepSp…...

自定义类型——结构体、枚举和联合

自定义类型——结构体、枚举和联合 结构体结构体的声明匿名结构体结构体的自引用结构体的初始化结构体的内存对齐修改默认对齐数结构体传参 位段枚举联合 结构体 结构是一些值的集合&#xff0c;这些值被称为成员变量&#xff0c;结构的每个成员可以是不同类型的变量。 数组是…...

Windows11系统安装Mysql8之后,启动服务net start mysql报错“服务没有响应控制功能”的解决办法

问题 系统环境&#xff1a;Windows11 数据库版本&#xff1a;Mysql8 双击安装&#xff0c;一路下一步&#xff0c;完成&#xff0c;很顺利&#xff0c;但是开启服务后 net start mysql 报错&#xff1a; 服务没有响应控制功能。 请键入 NET HELPMSG 2186 以获得更多的帮助 不…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...