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

【java安全】springBoot配置文件属性名自定义及属性值加密

文章目录

    • 0.背景
    • 1.修改配置文件,以数据源为例
    • 2. 自定义监听器
    • 3.启动类中需加入自定义的监听器
    • 4.加解密工具类
    • 5.正常启动并且可以正常访问数据库
    • 6.配套视频演示地址

0.背景

背景:
有些公司项目上线前需要检查配置文件中是否有username和passport的字样,有的话不允许上线,怎么整改成不容易阅读的字符而且还不影响程序运行呢,请往下看

1.修改配置文件,以数据源为例

spring.datasource.dbb.url=jdbc:mysql://localhost:3306/study2?useUnicode=true&allowPublicKeyRetrieval=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.dbb.username=root
spring.datasource.dbb.password=root
上边是自定义前的
下边是自定义后的
spring.datasource.url=pfxSphs3qHtr+PA34DmPwXzDOHzfjt792TiRKY4bMAeMjJF0yzDP3etw8dqny6CKngQnZfXjWAKB6N2tD9+/TuJ3hLXNTx49XFJQzZMaRyVHnWVg+4ommxURosZ/o8YuAhrLnfWIT5AWqOYeE4mg70bh2Wnba9x8K1zL2W0Yg7s=
spring.datasource.us=3jgmUpRuHqoLmF418AV7Sw==
spring.datasource.pa=3jgmUpRuHqoLmF418AV7Sw==

2. 自定义监听器

package com.dragon7531.bdemo.listener;import com.dragon7531.bdemo.aspect.PreventRepeatSubmitAspect;
import com.dragon7531.bdemo.utils.AesUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.env.ConfigurableEnvironment;public class MyAppEnvPreEveListener implementsApplicationListener<ApplicationEnvironmentPreparedEvent> {private static final Logger LOG = LoggerFactory.getLogger(MyAppEnvPreEveListener.class);@Overridepublic void onApplicationEvent(ApplicationEnvironmentPreparedEvent applicationEnvironmentPreparedEvent) {ConfigurableEnvironment environment = applicationEnvironmentPreparedEvent.getEnvironment();try {//jdbcString url = environment.getProperty("spring.datasource.url");String decUrl= AesUtil.decrypt(url);String unn = environment.getProperty("spring.datasource.us");String decUnn=AesUtil.decrypt(unn);String ppd = environment.getProperty("spring.datasource.pa");String decUPpd=AesUtil.decrypt(ppd);//redis的密码String redisPps = environment.getProperty("spring.redis.pps");if(redisPps!=null){//spring.redis.ppsString decRedisPps=AesUtil.decrypt(redisPps);System.setProperty("spring.redis.password", decRedisPps);}System.setProperty("spring.datasource.url", decUrl);System.setProperty("spring.datasource.username", decUnn);System.setProperty("spring.datasource.password", decUPpd);} catch (Exception e) {LOG.error("配置文件解密报错了"+e.getMessage());}}}

3.启动类中需加入自定义的监听器

@SpringBootApplication
public class BDemoApplication {public static void main(String[] args) {SpringApplicationBuilder builder = new SpringApplicationBuilder(BDemoApplication.class);builder.listeners(new MyAppEnvPreEveListener());builder.run(args);}
}

4.加解密工具类

package com.dragon7531.bdemo.utils;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;/*** Java使用AES加密算法进行加密解密* */
public class AesUtil {private static String aesDefaultKey="1234567890123456" ;public static String encrypt(String text) throws Exception {return encrypt(text,aesDefaultKey);}public static String decrypt(String text) throws Exception {return decrypt(text,aesDefaultKey);}/*** AES算法加密* @Param:text原文* @Param:key密钥* */public static String encrypt(String text,String key) throws Exception {// 创建AES加密算法实例(根据传入指定的秘钥进行加密)Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");// 初始化为加密模式,并将密钥注入到算法中cipher.init(Cipher.ENCRYPT_MODE, keySpec);// 将传入的文本加密byte[] encrypted = cipher.doFinal(text.getBytes());//生成密文// 将密文进行Base64编码,方便传输return Base64.getEncoder().encodeToString(encrypted);}/*** AES算法解密* @Param:base64Encrypted密文* @Param:key密钥* */public static String decrypt(String base64Encrypted,String key)throws Exception{// 创建AES解密算法实例Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");// 初始化为解密模式,并将密钥注入到算法中cipher.init(Cipher.DECRYPT_MODE, keySpec);// 将Base64编码的密文解码byte[] encrypted = Base64.getDecoder().decode(base64Encrypted);// 解密byte[] decrypted = cipher.doFinal(encrypted);return new String(decrypted);}public static void main(String[] args) throws Exception {//明文String text="123456";//秘钥(需要使用长度为16、24或32的字节数组作为AES算法的密钥,否则就会遇到java.security.InvalidKeyException异常)String key=aesDefaultKey;//加密,生成密文String base64Encrypted = encrypt(text,key);System.out.println(base64Encrypted);//解密,获取明文String text2 = decrypt(base64Encrypted,key);System.out.println(text2);}}

5.正常启动并且可以正常访问数据库

6.配套视频演示地址

https://www.bilibili.com/video/BV1Ga4y1z79U/

http://www.xdnf.cn/news/15244.html

相关文章:

  • 【6.1.0 漫画数据库技术选型】
  • 建造者模式(Builder)
  • 【Datawhale AI 夏令营】 用AI做带货视频评论分析(二)
  • 微服务环境下的灰度发布与金丝雀发布实战经验分享
  • 【电脑】硬盘驱动器(HDD)的基础知识
  • 消息认证码(message authentication code)MAC
  • skywalking镜像应用springboot的例子
  • 【设计模式】单例模式 饿汉式单例与懒汉式单例
  • jenkins自动化部署前端vue+docker项目
  • 并发--Callable vs Runnable
  • 代码随想录算法训练营第三十二天|LeetCode 509 斐波那契数,LeetCode 70 爬楼梯,LeetCode 746 使用最小花费爬楼梯
  • 笔记-分布式计算基础
  • 云计算三大服务模式深度解析:IaaS、PaaS、SaaS
  • zynq-PS篇——bperez77中DMA驱动注意事项
  • 飞算 JavaAI 智能编程助手:颠覆编程旧模式,重构新生态
  • 深入解析Java的G1收集器:原理、实战与优缺点
  • Umi-OCR 的 Docker安装(win制作镜像,Linux(Ubuntu Server 22.04)离线部署)
  • 企业采购成本越来越贵?根源在哪,数据怎么分析?
  • 奇哥面试记:SpringBoot整合RabbitMQ与高级特性,一不小心吊打面试官
  • 供应链管理-计划:产能策略
  • Java 并发AQS为什么是双向链表
  • [面试] 手写题-选择排序
  • 学习C++、QT---20(C++的常用的4种信号与槽、自定义信号与槽的讲解)
  • JavaAI时代:重塑企业级智能开发新范式
  • 秋招小白学数据结构-1-数据结构前置知识
  • 面向构件的编程(COP)深度解析:构建模块化系统的工程范式
  • Linux_3:进程间通信
  • (六)复习(OutBox Message)
  • 游戏的程序员会不会偷偷改自己账号的数据?
  • C++迭代器失效