SpringBoot 快速实现 api 接口加解密

news2024/12/23 13:34:34

在项目中,为了保证数据的安全,我们常常会对传递的数据进行加密。常用的加密算法包括对称加密(AES)和非对称加密(RSA)

项目介绍

该项目使用RSA加密方式对API接口返回的数据加密,让API数据更加安全。别人无法对提供的数据进行破解。Spring Boot接口加密,可以对返回值、参数值通过注解的方式自动加解密 。

什么是RSA加密

首先我们当然是了解RSA加密

RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。

举例子大法

加密和签名都是为了安全性考虑,但略有不同。常有人问加密和签名是用私钥还是公钥?其实都是对加密和签名的作用有所混淆。简单的说,加密是为了防止信息被泄露,而签名是为了防止信息被篡改。这里举2个例子说明。

插播一条,如果你近期准备面试跳槽,建议在ddkk.com在线刷题,涵盖 1万+ 道 Java 面试题,几乎覆盖了所有主流技术面试题,还有市面上最全的技术栈500套,精品系列教程,免费提供。

「第一个场景:」战场上,B要给A传递一条消息,内容为某一指令。

RSA的加密过程如下:

  • A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。
  • A传递自己的公钥给B,B用A的公钥对消息进行加密。
  • A接收到B加密的消息,利用A自己的私钥对消息进行解密。

在这个过程中,只有2次传递过程,第一次是A传递公钥给B,第二次是B传递加密消息给A,即使都被敌方截获,也没有危险性,因为只有A的私钥才能对消息进行解密,防止了消息内容的泄露。

「第二个场景:」A收到B发的消息后,需要进行回复“收到”。

RSA签名的过程如下:

  • A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。
  • A用自己的私钥对消息加签,形成签名,并将加签的消息和消息本身一起传递给B。
  • B收到消息后,在获取A的公钥进行验签,如果验签出来的内容与消息本身一致,证明消息是A回复的。

在这个过程中,只有2次传递过程,第一次是A传递加签的消息和消息本身给B,第二次是B获取A的公钥,即使都被敌方截获,也没有危险性,因为只有A的私钥才能对消息进行签名,即使知道了消息内容,也无法伪造带签名的回复给B,防止了消息内容的篡改。

但是,综合两个场景你会发现,第一个场景虽然被截获的消息没有泄露,但是可以利用截获的公钥,将假指令进行加密,然后传递给A。第二个场景虽然截获的消息不能被篡改,但是消息的内容可以利用公钥验签来获得,并不能防止泄露。所以在实际应用中,要根据情况使用,也可以同时使用加密和签名,比如A和B都有一套自己的公钥和私钥,当A要给B发送消息时,先用B的公钥对消息加密,再对加密的消息使用A的私钥加签名,达到既不泄露也不被篡改,更能保证消息的安全性。

加密实战

已经知道了RSA是干什么了。不就是 公钥加密、私钥解密、私钥签名、公钥验签

实战准备
1、新建一个springboot项目

springboot_api_encryption

2、引入maven依来
<dependency>
    <groupId>cn.shuibo</groupId>
    <artifactId>rsa-encrypt-body-spring-boot</artifactId>
    <version>1.0.1.RELEASE</version>
</dependency>
3、启动类Application中添加@EnableSecurity注解
@SpringBootApplication
@EnableSecurity
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
4、在application.yml或者application.properties中添加RSA公钥及私钥

公钥私钥的生成文章后面会放出生成工具

rsa:
  encrypt:
    open: false # 是否开启加密 true  or  false
    showLog: true # 是否打印加解密log true  or  false
    publicKey: # RSA公钥 软件生成
    privateKey: # RSA私钥 软件生成
5、对Controller 里面的API方法进行加密
@Encrypt
@GetMapping("/encryption")
public TestBean encryption(){
    TestBean testBean = new TestBean();
    testBean.setName("shuibo.cn");
    testBean.setAge(18);
    return testBean;
}
6、对传过来的加密参数解密

其他java端程序可以用注解,如果是vue,请用RSA密钥解密

@Decrypt
@PostMapping("/decryption")
public String Decryption(@RequestBody TestBean testBean){
    return testBean.toString();
}
实例操作
1、引入maven

2、启动类添加注解

3、YML添加配置密钥

4、创建一个实体类

5、写一个对外API接口

6、启动项目

请求地址: http://localhost:8080/encryption

我们看到返回的数据未加密

7、修改

修改open为true 打开加密

rsa:
  encrypt:
    open: true # 是否开启加密 true  or  false
    showLog: true # 是否打印加解密log true  or  false
    publicKey: # RSA公钥 软件生成
    privateKey: # RSA私钥 软件生成
8、再次重启项目

请求地址: http://localhost:8080/encryption

我们看到返回的数据已加密

9、加密日志

解密实战

如果是其他springboot项目,跟前面一样。我们这儿就当客户端是springboot项目,其他的请使用RSA解密协议解密!另外,搜索公众号编程技术圈后台回复“支付”,获取一份惊喜礼包。

服务端有私密钥、公密钥

前端只需要公密钥就可以

实战准备

在原来的springboot基础上写一份解密方法

1、前端js解密方法
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jsencrypt/3.0.0-rc.1/jsencrypt.js"></script>
2、后台增加解密方法
/**
 * 解密
 * @param user
 * @return
 */
@PostMapping("/decryption")
@Decrypt
@ResponseBody
public String Decryption(@RequestBody User user){
    System.out.println(user.toString());
    return user.toString();
}
3、js方法
#公钥
 var PUBLIC_KEY = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAobhGH4WMwMvJRUlTxWrCVIOQtsHijAxPJNvAWAgq80ADpFEWrpbcGB9cKqp6XHRH4k/CVtCUZ7jm9UKwhaeAm18sKtcwe+M8JFNX6FSHpgde0o8C9S/QpcmLxf4iN7nGZ7P3ZTvMdmKUcdRMsVQnsydG2Bj6gRxP2+kexEebTeODbdM7dHlkxAL0RxGWmX/ZOBzsoWZw2gKcC0vxwyIZBGHUdImG2T3nEA+VMfK2Yqv3uSYukmlKP+0mjfhrTtLFDuTV1VER9BfryBMvpQCxLO4pqgZnXPd+SOQcZHZ2OL0wqo5OX1+GPYx7TNxz5Qi76pK//T2mH7s6X/BuyT21HQIDAQAB';

/**
 * 加密方法
 * @returns {PromiseLike<ArrayBuffer>}
 * @constructor
 */
function RSA_encryption(jsonData) {
 var encrypt = new JSEncrypt();
 encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + PUBLIC_KEY + '-----END PUBLIC KEY-----');
 var encrypted = encrypt.encrypt(JSON.stringify(jsonData));
 console.log('加密前数据:%o', str);
 console.log('加密后数据:%o', encrypted);
 return encrypted;
}
/**
 * 提交方法
 */
function tijiao() {
 var str = {
  "name":"1223334",
  "password":"asd",
  age:1
 };
  $.ajax({
   url: "/decryption",
   type : "POST",
   contentType: "application/json;charset=utf-8",
   data : RSA_encryption(str) ,
   success : function(data) {
    alert(data);
   }
  })
}
实例操作
1、 Controller添加解密方法接口

2、前端页面引入js以及方法
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
加密传后端,后端解密
<button id="jiami" onclick="tijiao()">加密传后端</button>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jsencrypt/3.0.0-rc.1/jsencrypt.js"></script>
<script>
    var PUBLIC_KEY = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAobhGH4WMwMvJRUlTxWrCVIOQtsHijAxPJNvAWAgq80ADpFEWrpbcGB9cKqp6XHRH4k/CVtCUZ7jm9UKwhaeAm18sKtcwe+M8JFNX6FSHpgde0o8C9S/QpcmLxf4iN7nGZ7P3ZTvMdmKUcdRMsVQnsydG2Bj6gRxP2+kexEebTeODbdM7dHlkxAL0RxGWmX/ZOBzsoWZw2gKcC0vxwyIZBGHUdImG2T3nEA+VMfK2Yqv3uSYukmlKP+0mjfhrTtLFDuTV1VER9BfryBMvpQCxLO4pqgZnXPd+SOQcZHZ2OL0wqo5OX1+GPYx7TNxz5Qi76pK//T2mH7s6X/BuyT21HQIDAQAB';

    /**
     * 加密方法
     * @returns {PromiseLike<ArrayBuffer>}
     * @constructor
     */
    function RSA_encryption(jsonData) {
        var encrypt = new JSEncrypt();
        encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + PUBLIC_KEY + '-----END PUBLIC KEY-----');
        var encrypted = encrypt.encrypt(JSON.stringify(jsonData));
        console.log('加密前数据:%o', jsonData);
        console.log('加密后数据:%o', encrypted);
        return encrypted;
    }

    /**
     * 提交方法
     */
    function tijiao() {
        var str = {
            "name":"1223334",
            "password":"asd",
            age:1
        };
            $.ajax({
                url: "/decryption",
                type : "POST",
                contentType: "application/json;charset=utf-8",
                data : RSA_encryption(str) ,
                success : function(data) {
                    alert(data);
                }
            })
    }

</script>
</body>
</html>
3、启动访问

http://localhost:8080

4、后台解密日志

总结

经过上面的接口加密解密操作。可以看出我们的接口如果没有公钥、或者私钥别人根本无法解密!这样就对API接口起到了很好的保护作用,防止别人抓包!

祝大家:每天学习一点,技术成长飞快

项目坑点

难点就在前端如何加密回传到后台解密,此坑我带大家爬出来了!

以下是主意事项:

1、 主意ajax的contentType:“application/json;charset=utf-8”;

$.ajax({
    url: "/decryption",
    type : "POST",
    contentType: "application/json;charset=utf-8",
    data : RSA_encryption(str) ,
    success : function(data) {
        alert(data);
    }
})

2、 解密方法必须@RequestBody;

@PostMapping("/decryption")
@Decrypt
@ResponseBody
public String Decryption(@RequestBody User user){
    System.out.println(user.toString());
    return user.toString();
}

另外获取RSA公钥和私钥对的方法也在项目里。https://download.csdn.net/download/lujiawei00/88445660

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

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

相关文章

为什么嵌入通常优于TF-IDF:探索NLP的力量

塔曼纳 一、说明 自然语言处理&#xff08;NLP&#xff09;是计算机科学的一个领域&#xff0c;涉及人类语言的处理和分析。它用于各种应用程序&#xff0c;例如聊天机器人、情绪分析、语音识别等。NLP 中的重要任务之一是文本分类&#xff0c;我们根据文本的内容将文本分类为不…

windows设置右键打开 vscode的方法(简易版)

实现效果如下&#xff1a; 如果安装VScode时没有选择下面两项&#xff0c;则无法通过快捷键打开 如何设置右键打开VSCode&#xff1f; 具体步骤如下&#xff1a; 找到 VSCode的快捷方式&#xff0c;右键选择 属性。 复制目标中的文件所在路径。 创建一个文本文档&#…

实现最简的内核模块

实现最简单的内核模块&#xff0c;可从中窥探内核模块的编写流程。同时&#xff0c;也可以在其上进行扩展&#xff0c;对内核函数和全局变量进行调用和打印&#xff0c;熟悉内核接口。 在实现最简内核模块之前&#xff0c;在本地安装配置开发环境。可用选择使用vagrant工具快速…

AMEYA360:ROHM开发出可更大程度激发GaN器件性能的超高速栅极驱动器IC

全球知名半导体制造商ROHM(总部位于日本京都市)开发出一款超高速驱动GaN器件的栅极驱动器IC“BD2311NVX-LB”。 近年来&#xff0c;在服务器系统等领域&#xff0c;由于 IoT 设备的需求日益增长&#xff0c;电源部分的功率转换效率提升和设备的小型化已经成为重要的社会课题&am…

Cannot use object of type __PHP_Incomplete_Class as array

场景&#xff1a;将项目复制 出来一份后&#xff0c;修改控制器&#xff0c;打开后就报错 解决&#xff1a;将runtime 清除后就正常了

GEE:为机器学习算法(随机森林、支持矢量机等)加入膨胀/腐蚀特征

作者:CSDN @ _养乐多_ 腐蚀和膨胀 是数学形态学图像处理中的两个基本操作,用于修改和分析二值图像(包含只有两个像素值的图像,通常是黑和白)。这些操作可用于博客《GEE:随机森林分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积)》中写的机器学习…

字节码增强技术-ASM

概述 在Java中一般是用javac命令编译源代码为字节码文件&#xff0c;一个.java文件从编译到运行的示例如图所示: 使用字节码的好处&#xff1a;一处编译&#xff0c;到处运行。java 就是典型的使用字节码作为中间语言&#xff0c;在一个地方编译了源码&#xff0c;拿着.class …

逻辑回归揭秘: 从分类原理到机器学习实践

机器学习 第五课 逻辑回归 概述逻辑回归应用领域逻辑回归 vs 线性回归基本定义输出类型函数关系误差计算使用场景数据分布 逻辑回归的数学原理Sigmoid 函数多数几率似然函数逻辑回归损失函数 正则化L1 正则化L2 正则化L1 vs L2 实例 标准化为什么要标准化?如何进行标准化? 梯…

【Vue】前端解决跨域问题——反向代理

在 axios 请求路径只需填写资源路径&#xff1a; axios.get(/users).then(res > {console.log(res) })此时相当于向自己发送请求&#xff0c;会报 404。 然后在 vue.config,js 中配置反向代理&#xff1a; const { defineConfig } require(vue/cli-service) module.expo…

智安网络|从区块链到社交网络:解析去中心化的意义与应用

在当今数字化的世界中&#xff0c;一个越来越常见的概念是“去中心化”。从区块链技术到金融系统&#xff0c;从社交网络到数据存储&#xff0c;去中心化被认为是一种前所未有的方式来重新定义和改变传统的中心化结构。那么&#xff0c;去中心化到底是什么&#xff1f; 首先&a…

ThreadX任务栈大小确定及其溢出检测方法详解

在使用ThreadX实时操作系统&#xff08;RTOS&#xff09;进行嵌入式系统开发时&#xff0c;合理确定任务栈的大小及进行溢出检测是非常重要的。本篇博客将介绍如何确定ThreadX任务栈大小以及常用的溢出检测方法&#xff0c;并提供相应的代码示例。 一、确定ThreadX任务栈大小 …

基于springboot实现滴答拍摄影项目【项目源码+论文说明】计算机毕业设计

摘要 拍摄能让人放开自我、因看到不同的美景都想留下美好的记忆&#xff0c;有些人喜欢拍摄静物来表现宁静的氛围&#xff0c;通过小品类的照片&#xff0c;传达内心的情绪。而我更喜欢另一种方式&#xff0c;就是用长时间曝光把波动的海水或湖水雾化&#xff0c;拍摄出来的作…

Linux Docker图形化工具Portainer如何进行远程访问

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 Portainer 是一个轻量级的容器管理工具&#xff0c;可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可…

【合宙Air700E/780E短信转发】短信转发移动联通 不要钉钉不要微信,转发自建服务器-傻瓜式搭建

官方提供的教程介绍了通过钉钉、微信等工具接收短信验证码的方法&#xff0c;但最终实现的目的是获取验证码&#xff0c;而不是通过工具间接获得。 因此&#xff0c;我们可以直接调用API接口来获取验证码&#xff0c;从而达到更快、更便捷地获得验证码的目的。 所以做了一个服…

uniapp开发微信小程序,webview内嵌h5,h5打开pdf地址,解决方案

根据公司要求&#xff0c;让我写一个h5&#xff0c;后续会嵌入到合作公司的微信小程序的webview中&#xff0c;如果是自己公司微信小程序&#xff0c;可以采取先下载下来pdf&#xff0c;然后通过wx.openDocument&#xff0c;进行单纯的预览操作&#xff0c;这个可以根据这个老哥…

chromium arm64 新版

chrome官方并没有对外公布arm64的正式版本但debian已经适配&#xff0c;以下链接提取自debian可直接一条命令安装&#xff1a;sudo dpkg -i *.deb即可 https://www.aliyundrive.com/s/vVCpzTyFjH6

CV、MV基础知识(持续补充ing)

文章目录 全局自注意机制Permutation InvariantMLP扩展比AP、mAP、FLOPs、FPS、Top1、mIoUAP (平均精度)&#xff1a;mAP (平均精度均值)&#xff1a;FLOPs (浮点运算数)&#xff1a;FPS (每秒帧数)&#xff1a;Top1 (前1精度)&#xff1a;mIoU (平均交并比)&#xff1a; Preci…

虚幻引擎:代理

一、代理类型 1.单薄代理 特点&#xff1a;允许有返回值&#xff0c;允许有参数&#xff0c;只可以一对一的传递消息就算绑定多个&#xff0c;但是总会被最后一个覆盖 2.多播代理 特点&#xff1a;不允许有返回值&#xff0c;允许有参数允许一对多传递消息 3.动态代理 …

25 个超棒的 Python 脚本合集

Python是一种功能强大且灵活的编程语言&#xff0c;拥有广泛的应用领域。下面是一个详细介绍25个超棒的Python脚本合集&#xff1a; 1. 网络爬虫&#xff1a;使用Python可以轻松编写网络爬虫&#xff0c;从网页中提取数据并保存为结构化的格式。 2. 数据清洗和预处理&#xf…

GEE:对二值图层进行腐蚀和/或膨胀操作

作者:CSDN @ _养乐多_ 腐蚀和膨胀 是数学形态学图像处理中的两个基本操作,用于修改和分析二值图像(包含只有两个像素值的图像,通常是黑和白)。这些操作可用于处理遥感图像、地理信息系统(GIS)中的栅格数据以及其他领域的图像处理。 腐蚀(Erosion):腐蚀是一种用于缩小…