百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Spring Boot接口参数和返回值统一加密

lipiwang 2024-10-27 13:28 7 浏览 0 评论

对敏感信息加密是软件开发的一个永恒的话题,特别现在国家这么重视个人用户信息的泄露问题。今天给大家介绍一个网友开发的Spring Boot starter。如果以后工作中遇到需要对接口的参数和返回值统一加密,说不定这个starter就可以派上用场,即使不使用这个starter,也可以参考一下别人是怎么对接口的数据进行统一加解密的。

代码仓库

https://gitee.com/agile-bpm/rsa-encrypt-body-spring-boot

0x01:pom文件中引入

<dependency>
 <groupId>cn.shuibo</groupId>
 <artifactId>rsa-encrypt-body-spring-boot</artifactId>
 <version>1.0.0.RELEASE</version>
</dependency>

0x02:启动类Application中添加@EnableSecurity注解

@SpringBootApplication
@EnableSecurity
public class DemoApplication {
 public static void main(String[] args) {
 SpringApplication.run(DemoApplication.class, args);
 }
}

0x03:在application.yml或者application.properties中添加RSA公钥及私钥

rsa:
 encrypt:
 debug: false # true表示开启调试,不加密。(方便开发时测试)
 publicKey: xxxxxx
 privateKey: xxxxxx

0x04:对返回值进行加密

@Encrypt
@GetMapping("/encryption")
public TestBean encryption(){
 TestBean testBean = new TestBean();
 testBean.setName("shuibo.cn");
 testBean.setAge(18);
 return testBean;
}

0x05:对传过来的加密参数解密

@Decrypt
@PostMapping("/decryption")
public String Decryption(@RequestBody TestBean testBean){
 return testBean.toString();
}

0x06:可以借鉴的经验

小编在项目开发中经常遇到对敏感信息加密的情况,主要像身份证、手机号、姓名等。使用最多的是RSA和AES加解密,比对这两种加解密时有这样的一些经验

  • RSA如果对长数据加密需要使用分段加密,JS分段加解密非常麻烦
  • AES非常容易对长数据进行加密

RSA加解密

参考:https://www.cnblogs.com/jiafuwei/p/7054500.html

AEs加解密

package demo.security;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;
import java.util.Scanner;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/*
 * AES对称加密和解密
 */
public class SymmetricEncoder {
 /*
 * 加密
 * 1.构造密钥生成器
 * 2.根据ecnodeRules规则初始化密钥生成器
 * 3.产生密钥
 * 4.创建和初始化密码器
 * 5.内容加密
 * 6.返回字符串
 */
 public static String AESEncode(String encodeRules,String content){
 try {
 //1.构造密钥生成器,指定为AES算法,不区分大小写
 KeyGenerator keygen=KeyGenerator.getInstance("AES");
 //2.根据ecnodeRules规则初始化密钥生成器
 //生成一个128位的随机源,根据传入的字节数组
 keygen.init(128, new SecureRandom(encodeRules.getBytes()));
 //3.产生原始对称密钥
 SecretKey original_key=keygen.generateKey();
 //4.获得原始对称密钥的字节数组
 byte [] raw=original_key.getEncoded();
 //5.根据字节数组生成AES密钥
 SecretKey key=new SecretKeySpec(raw, "AES");
 //6.根据指定算法AES自成密码器
 Cipher cipher=Cipher.getInstance("AES");
 //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
 cipher.init(Cipher.ENCRYPT_MODE, key);
 //8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
 byte [] byte_encode=content.getBytes("utf-8");
 //9.根据密码器的初始化方式--加密:将数据加密
 byte [] byte_AES=cipher.doFinal(byte_encode);
 //10.将加密后的数据转换为字符串
 //这里用Base64Encoder中会找不到包
 //解决办法:
 //在项目的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。
 String AES_encode=new String(new BASE64Encoder().encode(byte_AES));
 //11.将字符串返回
 return AES_encode;
 } catch (NoSuchAlgorithmException e) {
 e.printStackTrace();
 } catch (NoSuchPaddingException e) {
 e.printStackTrace();
 } catch (InvalidKeyException e) {
 e.printStackTrace();
 } catch (IllegalBlockSizeException e) {
 e.printStackTrace();
 } catch (BadPaddingException e) {
 e.printStackTrace();
 } catch (UnsupportedEncodingException e) {
 e.printStackTrace();
 }
 //如果有错就返加nulll
 return null; 
 }
 /*
 * 解密
 * 解密过程:
 * 1.同加密1-4步
 * 2.将加密后的字符串反纺成byte[]数组
 * 3.将加密内容解密
 */
 public static String AESDncode(String encodeRules,String content){
 try {
 //1.构造密钥生成器,指定为AES算法,不区分大小写
 KeyGenerator keygen=KeyGenerator.getInstance("AES");
 //2.根据ecnodeRules规则初始化密钥生成器
 //生成一个128位的随机源,根据传入的字节数组
 keygen.init(128, new SecureRandom(encodeRules.getBytes()));
 //3.产生原始对称密钥
 SecretKey original_key=keygen.generateKey();
 //4.获得原始对称密钥的字节数组
 byte [] raw=original_key.getEncoded();
 //5.根据字节数组生成AES密钥
 SecretKey key=new SecretKeySpec(raw, "AES");
 //6.根据指定算法AES自成密码器
 Cipher cipher=Cipher.getInstance("AES");
 //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY
 cipher.init(Cipher.DECRYPT_MODE, key);
 //8.将加密并编码后的内容解码成字节数组
 byte [] byte_content= new BASE64Decoder().decodeBuffer(content);
 /*
 * 解密
 */
 byte [] byte_decode=cipher.doFinal(byte_content);
 String AES_decode=new String(byte_decode,"utf-8");
 return AES_decode;
 } catch (NoSuchAlgorithmException e) {
 e.printStackTrace();
 } catch (NoSuchPaddingException e) {
 e.printStackTrace();
 } catch (InvalidKeyException e) {
 e.printStackTrace();
 } catch (IOException e) {
 e.printStackTrace();
 } catch (IllegalBlockSizeException e) {
 e.printStackTrace();
 } catch (BadPaddingException e) {
 e.printStackTrace();
 }
 //如果有错就返加nulll
 return null; 
 }
 public static void main(String[] args) {
 SymmetricEncoder se=new SymmetricEncoder();
 Scanner scanner=new Scanner(System.in);
 /*
 * 加密
 */
 System.out.println("使用AES对称加密,请输入加密的规则");
 String encodeRules=scanner.next();
 System.out.println("请输入要加密的内容:");
 String content = scanner.next();
 System.out.println("根据输入的规则"+encodeRules+"加密后的密文是:"+se.AESEncode(encodeRules, content));
 /*
 * 解密
 */
 System.out.println("使用AES对称解密,请输入加密的规则:(须与加密相同)");
 encodeRules=scanner.next();
 System.out.println("请输入要解密的内容(密文):");
 content = scanner.next();
 System.out.println("根据输入的规则"+encodeRules+"解密后的明文是:"+se.AESDncode(encodeRules, content));
 }
}

项目中通常可以采取这样的规则进行加解密:使用非对称加密算法RSA对对称加密算法AES的密钥进行加密,然后使用对称加密算法AES对参数和返回的数据进行加解密

相关推荐

想减少Windows 11内存占用?请取消固定Teams

如果你想要提高Windows11系统的运行速度,那么可以禁用某些默认启用的功能和设置。如果你的Windows11是安装在已经停止支持的设备或者内存容量不高的旧设备,那么应该立即限制或禁用固...

Windows查看端口占用、查看PID对应的进程、并终止进程

Windows下:查看端口占用netstat-ano|findstr"端口号"获取到pid查看PID对应的进程tasklist|findstr"进程ID"...

计算机组成原理(36): 分时之一——进程

建立一个虚拟机VM目标:给每个程序一个自己的虚拟机“VirtualMachine”,程序并不知道其他的虚拟机。1.1进程(Process)为了捕获正在运行的程序,我们创建一个称为“进程(Proce...

window系统如何停止端口被占用的进程(高手版)

如上图1,作为开发人员是不是经常遇到这个问题?(Webserverfailedtostart.Port9527wasalreadyinuse.)当然,如果在你知道确实有某个进程正占...

电脑的文件无法删除咋回事?你需要这款神兵利器

很多朋友用电脑的时候,都遇到过文件无法删除的情况。这往往是由于文件被某个软件、进程所调用所引发的——在Windows中,某个文件如果被使用,这个文件可能就没法进行删除、重命名之类的操作了。想要进一步操...

Windows日志分析(windows 日志文件)

1.Windows日志文件简介1.1Windows日志核心分类1.系统日志系统日志包含由Windows系统组件记录的事件,记录系统进程和设备驱动程序的活动。由它审核的系统事件包括启动失败的设备驱动程...

电脑软件崩溃、闪退不用慌!DJS Tech 教你几招轻松解决

当你正全神贯注用电脑处理重要文件、沉浸在精彩的游戏世界,或是观看喜欢的视频时,软件突然崩溃、闪退,那一刻的烦躁简直难以言喻。别着急,DJSTech作为深耕计算机领域多年的专业团队,为你带来一系列超...

微软Win11推进淘汰控制面板,时间服务器配置迁移至设置应用

IT之家5月29日消息,科技媒体Winaero昨日(5月28日)发布博文,报道称微软在Windows11系统中,继续推进“淘汰控制面板”进程,配置时间服务器地址选项迁移到设置应...

微软 PowerToys更新,可帮你找出 Win11上哪些进程正在占用该文件

IT之家11月3日消息,微软针对Windows11和Windows10的PowerToys已经更新到了最新的0.64.0版本,并上线了一个名为“文件锁匠FileLock...

Windows基础操作 认识任务管理器(windows任务管理器的使用)

Windows基础操作:认识任务管理器任务管理器(TaskManager)是Windows系统中一个功能强大的实用工具,它为用户提供了实时监控系统资源、管理正在运行的程序和服务的能力。掌握任务管理器...

windows——netstat过滤(终止进程)

windows——netstat过滤(终止进程)在Windows操作系统中,使用netstat命令可以查看网络连接的状态。要过滤特定协议或端口的连接,可以使用以下命令:查看所有连接:netstat-...

只要这么做 Windows Defender与第三方就能和平共存啦

无论大家是否喜欢WindowsDefender,伴随着Windows10的不断升级,它已经成为系统的底层必备组件之一。虽然我们有各种各样的方法去关闭它,换用顺手的第三方,但只要更新打补丁,噩梦就来...

Win10如何彻底关闭wsappx进程(win10 wsappx怎么关闭)

win10如何彻底关闭wsappx进程?wsappx进程是什么?wsappx进程是Windows10系统的一部分,这个进程是WindowsStore和微软通用应用程序平台(UWP)的依赖进程。...

Windows环境黑客入侵应急与排查(黑客入侵电脑原理)

1文件分析1.1临时目录排查黑客往往可能将病毒放在临时目录(tmp/temp),或者将病毒相关文件释放到临时目录,因此需要检查临时目录是否存在异常文件。假设系统盘在C盘,则通常情况下的临时目录如下...

Windows 11 24H2 KB5044384出现大面积安装失败、任务管理器0进程等问题

Windows11KB5044384更新由于出现大量错误而无法在Windows1124H2上安装、其中包括一个奇怪的错误,即由于0x800f0922、0x800736b3和0x8...

取消回复欢迎 发表评论: